课程作业六

代码地址
[栈]{https://github.com/metamorphos/Circle/tree/master}

讲解####

在做这次作业时,参考了百度上关于栈的讲解,上次作业里完成了中缀后缀表达式的学习,这次对栈进行空间初始化和运算符优先级表的运用。
设置了一个 priority 变量进行存储栈顶元素的优先级,这在中缀转后缀的时候被使用到,并在每次的压栈出栈后,都须对新的栈顶元素进行记录其优先级。

//参数说明:  
//sta:    转换过程需使用的栈空间  
//infix:  待转换的中缀表达式  
//suffix: 存储转换后的后缀表达式  
//length: 记录后缀表达式的长度  
void infix_to_suffix(Stack *sta, char *infix, int *suffix, int *length);  
int  suffix_to_result(Stack *sta, int *suffix, int length);  
void init(Stack *sta);//栈空间初始化  
 int main()  
{   
//  freopen("in.txt", "r", stdin);  
//  freopen("out.txt", "w", stdout); //将输入输出流存储到文件中 
    Stack     sta;  
    int       length;  
    int       result;         //接受后缀表达式转换的结果  
    int       sstr[MAXSIZE];  //存储后缀表达式  
    char      istr[MAXSIZE];  //存储中缀表达式  
  
    printf("请输入以 + - * / 组成的四则运算\n);  
    scanf("%s", istr);  
  
    init(&sta); //对栈空间初始化  
    infix_to_suffix(&sta, istr, sstr, &length);  
    init(&sta); //再次对栈空间初始化  
    result = suffix_to_result(&sta, sstr, length);  
  
    printf("%d\n", result);  
//  fclose(stdin);  
//  fclose(stdout); //关闭文件夹; 
    return    0;  
}  
  
  
void infix_to_suffix(Stack *sta, char *infix, int *suffix, int *length)  
{  
    int    i;             
    int    b = 0;           //当数字是十位或以上的时候进行记录  
    int    j = 0;           //suffix数组的下标  
    int    priority = 0;      
 
    for (i = 0; i < strlen(infix); )  
    {  
        //如果是数字的话,直接放在suffix中,然后continue  
        if (infix[i] >= '0' && infix[i] <= '9')  
        {  
            b = 0;     
  
            while (infix[i] >= '0' && infix[i] <= '9')  
            {  
                b = b * 10 + (infix[i] - '0');  
                i++;  
            }  
            suffix[j] = b;  
            j++;  
            continue;  
        }  
  
        //如果是右括号的话,将栈中在左括号以上的所有运算符弹出,然后continue  
        if (infix[i] == 41)  
        {  
            while (sta->data[sta->top] != 40)  
            {  
                suffix[j] = sta->data[sta->top];  
                sta->data[sta->top] = 0;  
                sta->top--;  
                j++;  
            }  
            sta->data[sta->top] = 0;  
            sta->top--;   
            priority = table[sta->data[sta->top] % 10];  
            i++;  
            continue;  
        }  
  
        //如果是左括号的话,直接压栈  
        if (infix[i] == 40)  
        {  
            sta->top++;  
            sta->data[sta->top] = infix[i];  
            priority = table[sta->data[sta->top] % 10];  
            i++;  
            continue;  
        }  
  
        //如果只是普通的运算符,则压栈  
        if (infix[i] >= 42 && infix[i] <= 47)  
        {  
            //首先比较栈顶元素的优先级是否比入栈元素优先级要大  
            //如果是大于的话,则从栈顶将元素依次出栈后,把待入栈的元素压栈  
            if (priority >= table[infix[i] % 10])  
            {  
                while (priority >= table[infix[i] % 10] && sta->data[sta->top] != 40)  
                {  
                    suffix[j] = sta->data[sta->top];  
                    sta->data[sta->top] = 0;  
                    sta->top--;   
                    priority = table[sta->data[sta->top] % 10];  
                    j++;  
                }  
                sta->top++;  
                sta->data[sta->top] = infix[i];   
                priority = table[sta->data[sta->top] % 10];  
                i++;  
            }  
            else   
            {  
                //处理负数  
                if (infix[i] == 45 && sta->data[sta->top] == 40)  
                {  
                    b = 0;  
                    while (infix[i+1] >= '0' && infix[i+1] <= '9')  
                    {  
                        b = b * 10 + (infix[i+1] - '0');  
                        i++;  
                    }  
                    suffix[j] = b * -1;  
                    sta->data[sta->top] = 0;  
                    sta->top--;  
                    j++;  
                    i += 2;  
                    priority = table[sta->data[sta->top] % 10];  
                    continue;  
                }  
                sta->top++;  
                sta->data[sta->top] = infix[i];  
                //注意压栈后,须将新的栈顶元素的优先级记录下来  
                priority = table[sta->data[sta->top] % 10];  
                  
                i++;  
            }  
  
        }  
    }  
    while (sta->top != -1)  
    {  
        suffix[j] = sta->data[sta->top];  
        sta->top--;  
        j++;  
    }  
    *length = j;  
}  
  
  
int suffix_to_result(Stack *sta, int *suffix, int length)  
{  
    int    i;  
    int    j;  
    int    result = 0;
}

程序截图####

学习C++界面编程####

还没开始学,以后补上。

posted @ 2017-05-31 20:30  吾言  阅读(137)  评论(0编辑  收藏  举报