C/C++:栈的应用:中缀转后缀

void trans(SqStack* s, char exp[], char postexp[])//引入中缀和后缀
{
    char ch;
    int i, j;  //i为中缀exp的下标,j为后缀postexp的下标
    s->top = 0;
    ch = exp[i]; //
    i++;
    while (ch != '\0')
    {
        switch (ch)
        {
        case'(':  //遇到左括号直接入栈
            s->top++;
            s->data[s->top] = ch;
            break;

        case')': //遇到右括号,栈顶元素不断出栈直到遇到左括号
            while (s->data[s->top] != '(')
            {
                postexp[j] = s->data[s->top];
                j++;
                s->top--;
            }
            s->top--; //遇到了左括号,直接删除
            break;

        case'+': //因为加减的优先级最低,所以直接入栈
        case'-':
            while (s->top == 0 && s->data[s->top] != '(')
            {    //栈不为空且没有遇到左括号,都直接出栈
                postexp[j] = s->data[s->top];
                j++;
                s->top--;
            }
            s->top++; //即:栈为空或者遇到左括号,当前运算符进栈
            s->data[s->top] = ch;
            break;
        case '*':
        case '/':
            while (s->top != -1 && s->data[s->top] != '(' && (s->data[s->top] == '*' || s->data[s->top] == '/')) {
                postexp[j] = s->data[s->top];  //栈不为空且没有遇到左括号且遇到了同级符号:都出栈 
                j++;
                s->top--;
            }
            s->top++;   //不满足上述时,入栈 
            s->data[s->top] = ch;
            break;
        case ' ':break;   //过滤空格
            //default一般用在最后,表示非以上的任何情况下而发生的情况,
        default:
            while (ch >= '0' && ch <= '9') { //输入的是数字 
                postexp[j] = ch;   //直接入栈 
                j++;
                ch = exp[i];  //遍历下一个数字 
                i++;
            }
            i--;
            postexp[j] = '#';  //用#标识一个数值串结束 
            j++;
            break;
        }
        ch = exp[i];
        i++;
    }
    while (s->top != -1) {   //此时exp扫描完毕,栈不空时出栈并存放到postexp中 
        postexp[j] = s->data[s->top];
        j++;
        s->top--;
    }
    postexp[j] = '\0';   //添加结束标识,后缀表达式输入完毕 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值