利用栈的先入后出思想:
中缀转后缀表达 思路:对这种数据进行处理时需对表达式进行加上括号
1.仍然从左至右来处理数据
2.当遇到左括号时,忽略它
3.当遇到数值时,直接输出
4.当遇到操作符时,将操作符入栈
5.当遇到右括号时,出栈顶的操作符
例1.(1+4)*(5+8)
14+58+*
例2. 1+4*5*8
14+5*8* 这种转换即为错误的
//数据结构之栈的应用:中缀转后缀 C实现:
//数据结构之栈的应用:中缀转后缀 //@输入:((1+8)*(8*2)*8) //@输出:18+82*8* //@输入:((1+8)*(8+2)) //@输出:18+82+* //注 本函数需要严格按照给定格式输入 最外层要添加括号 不然会输出错误 #include#include int stack[512]; //存放栈的数据 int top = 0; //指向栈顶的指针 void push(char c); //入栈操作 int pop(void); //出栈操作 int is_empty(void); //检测栈是否为空 void postfix(void); //将中缀转为后缀实现函数 int main(void) { postfix(); return 0; } //入栈操作 void push(char c) { stack[top++] = c; } //出栈操作 int pop(void) { return stack[--top]; } //检测栈是否为空 int is_empty(void) { return top == 0; } //将中缀转为后缀实现函数 void postfix(void) { char str[100]; //存储输入的表达式 int len; printf("请输入表达式:n"); gets(str); len = strlen(str); for (int i = 0; i < len; i++) { //1.从左到右处理数据 if (str[i] == '(') //2.遇到左括号时,忽略它 continue; //直接将这个语句跳过 else if (str[i] >= '0' && str[i] <= '9' ) //3.遇到数值时,直接输出 printf("%c", str[i]); else if ((str[i] == '+') || (str[i] == '-') || (str[i] == '*')) //逻辑与有一个为真即为真 push(str[i]); //4.当遇到操作符时将操作符入栈 else if (str[i] == ')') //5.当遇到右括号时,出栈顶的操作符 printf("%c", pop()); } }
无注释版本:
#include#include char stack[512]; int top = 0; void push(char c); char pop(void); int is_empty(void); int main(void) { char str[100]; int i, len; printf("Please enter a calcuate expression:"); gets(str); len = strlen(str); for (i = 0; i < len; i++) { if (str[i] == '(') continue; else if ((str[i] >= '0') && (str[i] <= '9')) printf("%c", str[i]); else if ((str[i] == '+') || (str[i] == '-') || (str[i] == '*')) push(str[i]); else if (str[i] == ')') printf("%c", pop()); } printf("n"); return 0; } void push(char c) { stack[top++] = c; } char pop(void) { return stack[--top]; } int is_empty(void) { return top == 0; }



