用栈和队列实现中缀表达式的求解

今天为了复习栈和队列的相关知识,所以尝试着用c写了一段求解中缀表达式的程序。主要分两步实现:一是完成中缀表达式到后缀表达式的转换,二是实现中缀表达式的求解。

用栈可以比较方便地将中缀表达式转化为后缀表达式,举个例子,如果我们从控制台输入这样一个中缀表达式:12+5*(4+2*3)-6,那么它对应的后缀表达式就是12 5 4 2 3 * + * + 6 -。那么,我们怎样用栈实现这个中缀表达式到它所对应的后缀表达式的转换呢?首先我们需要定义一个栈,用于转换表达式,另外我们还需要一个队列来保存转换结果,以便进行下一步的求解。值得注意的是从控制台输入的表达式是保存在缓冲区的,而缓冲区中实际上依次存储这样的一串字符:‘1’ ’2‘ ’+‘ ’5‘ ’*‘ ’(‘ ’4‘ ’+‘ ’2‘ ’*‘ ’3‘ ’)‘ ’-‘ ’6‘ ’\n'。用getchar()依次读取字符,接下去的操作是这样的:

  1. ‘1’ ’2‘是数字,直接入队列;
  2. 发现’+‘,因为是第一个运算符所以入栈保存;
  3. ’5‘是数字 ,直接入队列,入队列;
  4. 发现 ’*‘,因为 ’*‘的优先级比‘+’高,所以‘5’不是‘+’的右操作数,要先知道‘*’的又操作数才能知道‘+’的右操作数,‘*’入栈;
  5. 发现‘(’,无条件入栈,在遇到‘)’之前我们都不知道‘*’的右操作数是谁。
  6. ‘4’是数字,入队列;
  7. 发现’+‘,因为是‘(’后的第一个运算符所以入栈保存;
  8. ‘2’是数字,入队列;
  9. 发现‘*’,因为’*‘的优先级比‘+’高,所以‘2’不是‘+’的右操作数,‘*’入栈;
  10. ‘3’是数字,入队列;
  11. 发现‘)’,说明‘3’确实是’*‘的右操作数,依次输出取走栈顶的操作符,放入队列中,直到发现‘(’,‘(’只出栈,不入队列;
  12. 发现‘-’,因为栈顶是’*‘,比‘-’优先级高,说明前面的一整坨是’*‘的右操作数,‘*’出栈,入队列
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值