中缀表达式的计算 c语言链表实现
1题目
输入一个中缀算术表达式,计算其结果。对输入的表达式,做如下假设:
(1)只考虑+、-、*、/这四种运算符,中缀表达式中只有一种括号();
(2)输入的中缀表达式中数字只有整数,没有小数;
(3)假定输入表达式是合法的。
2测试用例
中缀表达式:(1)1+(2-3)*4+4/2 (2)a+(b-c)*d
3算法
建立两个栈,分别储存数字和运算符,在读取表达式的时候,凡是遇到数字,就将其压栈,压入stack1,当遇到运算符的时候进行判断,若栈为空,进行压栈,若运算符为左括号,也进行压栈,为右括号,则进行计算,计算至左括号处,若为一般的运算符,则与前一个运算符的优先级进行比较,若前一个的优先级高或者相等,则先进行运算,反之,则将该运算符压栈。最后输出数字栈中的数字,即为运算结果。
4 算法过程的模拟
例 1+(2-3)*4+4/2
stack1 | stack2 |
---|
读取表达式,读取为1,将其存入stack1
stack1 | stack2 |
---|---|
1 |
读取第二个,为运算符,此时stack2为空,则直接压栈
stack1 | stack2 |
---|---|
1 | + |
读取第三个,为左括号,进行压栈
stack1 | stack2 |
---|---|
1 | + |
( |
读取第四个,为数字,对stack1进行压栈
stack1 | stack2 |
---|---|
1 | + |
2 | ( |
读取第五个,为运算符,与前一个进行运算级的比较,大于左括号,则进行压栈
stack1 | stack2 |
---|---|
1 | + |
2 | ( |
- |
读取第六个,为数字,对stack1进行压栈
stack1 | stack2 |
---|---|
1 | + |
2 | ( |
3 | - |
读取第七个,为右括号,则进行运算,运算至左括号处,左括号输出,则有
stack1 | stack2 |
---|---|
1 | + |
-1 |
读取第八个,为乘号,比较运算优先级,应进行压栈
stack1 | stack2 |
---|---|
1 | + |
-1 | * |
读取第九个,为数字,对stack1进行压栈
stack1 | stack2 |
---|---|
1 | + |
-1 | * |
4 |
读取第十个,为运算符,比较优先级,发现应进行运算,则有Stack1: stack2:
stack1 | stack2 |
---|---|
1 | + |
-4 |
继续读取第十个,与前一个优先级进行比较,应进行运算
stack1 | stack2 |
---|---|
-3 |
继续读取第十个,此时stack2为空,则进行压栈
stack1 | stack2 |
---|---|
-3 | + |
读取下一个,为数字,对stack1压栈,有
stack1 | stack2 |
---|---|
-3 | + |
4 |
读取下一个,为运算符,比较应压栈,有
stack1 | stack2 |
---|---|
-3 | + |
4 | / |
读取下一个,为数字,压栈
stack1 | stack2 |
---|---|
-3 | + |
4 | / |
2 |
读取下一个,读取发现多项式结束,则进行运算至结束
stack1 | stack2 |
---|---|
-1 |
输出运算结果,为-1。
代码如下:
#include <stdio.h>
#include <stdlib.h>
static int stack1[100];
static char stack2[100];
static char str