四则运算中缀转后缀(C语言)
本文参考自《大话数据结构》
算法思路
遇到数字直接输出,使用栈来存储,通过比较运算符的优先级,判断是否要将栈顶符号输出:
- 如果栈顶符号优先级不比字符串当前所指符号优先级低,则输出;否则将符号入栈;
- 括号优先级最高(),遇到 ) 括号则匹配栈中的 ( 括号,将括号中所有符号输出;
- 字符串遍历结束后,将栈中符号全部输出;
原书例题
9+(3-1)*3+10/2:
- 数字9直接输出,输出结果:9
- 栈为空,栈中没有符号,此时+号入栈,栈中符号为(左边为栈顶):+
- ( 优先级最高,入栈,栈中符号:(+
- 数字3,直接输出,输出结果:9 3
- - 号,优先级比栈顶符号 ( 低,入栈,栈中符号为:- ( +
- 数字1,直接输出,输出结果:9 3 1
- ) 号,匹配栈中 ( ,将括号内符号都出栈(括号不输出),输出结果:9 3 1 - ,栈中符号:+
- 乘号( * ),优先级比栈顶符号+高,入栈,栈中符号:* +
- 数字3,直接输出,输出结果:9 3 1 - 3
- +号,优先级不比栈顶符号*高,也不比栈中+高,所以栈中符号全部输出,新+号入栈,此时输出结果:9 3 1 - 3 * +,栈中符号为:+
- 数字10直接输出,输出结果:9 3 1 - 3 * + 10
- /号,比栈顶符号+优先级高,入栈,栈中符号:/ +
- 数字2,直接输出,输出结果:9 3 1 - 3 * + 10 2
- 字符串遍历结束,输出栈中剩下的所有符号,输出结果:9 3 1 - 3 * + 10 2 / +
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100 //多项式最大长度
typedef struct Stack{
char ch;
struct Stack* next = NULL;
}Stack;
typedef struct LinkStack{
struct Stack* top = NULL;
int count;
}LinkStack;
int main(){
Stack termStack,