四则运算中缀转后缀(C语言)

本文介绍了如何用C语言实现四则运算的中缀表达式转换为后缀表达式的方法。通过算法思路、原书例题及代码实现详细讲解,涉及运算符优先级和栈的操作。例如,对于9+(3-1)*3+10/2的转换过程,解释了如何处理括号和不同运算符的优先级。

四则运算中缀转后缀(C语言)

本文参考自《大话数据结构》

算法思路

遇到数字直接输出,使用栈来存储,通过比较运算符的优先级,判断是否要将栈顶符号输出:

  1. 如果栈顶符号优先级不比字符串当前所指符号优先级,则输出;否则将符号入栈;
  2. 括号优先级最高(),遇到 ) 括号则匹配栈中的 ( 括号,将括号中所有符号输出;
  3. 字符串遍历结束后,将栈中符号全部输出;

原书例题

9+(3-1)*3+10/2:

  1. 数字9直接输出,输出结果:9
  2. 栈为空,栈中没有符号,此时+号入栈,栈中符号为(左边为栈顶):+
  3. ( 优先级最高,入栈,栈中符号:(+
  4. 数字3,直接输出,输出结果:9 3
  5. - 号,优先级比栈顶符号 ( 低,入栈,栈中符号为:- ( +
  6. 数字1,直接输出,输出结果:9 3 1
  7. ) 号,匹配栈中 ( ,将括号内符号都出栈(括号不输出),输出结果:9 3 1 - ,栈中符号:+
  8. 乘号( * ),优先级比栈顶符号+高,入栈,栈中符号:* +
  9. 数字3,直接输出,输出结果:9 3 1 - 3
  10. +号,优先级不比栈顶符号*高,也不比栈中+高,所以栈中符号全部输出,新+号入栈,此时输出结果:9 3 1 - 3 * +,栈中符号为:+
  11. 数字10直接输出,输出结果:9 3 1 - 3 * + 10
  12. /号,比栈顶符号+优先级高,入栈,栈中符号:/ +
  13. 数字2,直接输出,输出结果:9 3 1 - 3 * + 10 2
  14. 字符串遍历结束,输出栈中剩下的所有符号,输出结果: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, *p;
	LinkStack linkStack, *S=&linkStack;
	char s
### C语言实现中缀表达式后缀表达式的编译方法 在C语言中,可以通过栈这一数据结构来完成中缀表达式后缀表达式换。具体来说,这种方法利用了栈的操作特性(如压入和弹出)以及运算符优先级的概念[^3]。 以下是基于栈的算法逻辑描述: 1. 初始化一个空栈用于存储操作符。 2. 遍历输入的中缀表达式中的每一个字符。 - 如果当前字符是一个操作数,则将其直接输出到结果字符串中。 - 如果当前字符是一个左括号`(`,则将其压入栈中。 - 如果当前字符是一个右括号`)`,则依次从栈中弹出操作符并加入结果字符串,直到遇到对应的左括号为止,并将该左括号移除。 - 如果当前字符是一个操作符(如`+`, `-`, `*`, `/`),则比较其与栈顶操作符的优先级: - 若栈为空或者栈顶为左括号`(`,则直接将当前操作符压入栈中; - 否则,如果当前操作符的优先级小于等于栈顶操作符的优先级,则持续弹出栈顶操作符至结果字符串,直至满足条件后再将当前操作符压入栈中。 3. 当遍历完成后,若栈不为空,则依次弹出剩余的操作符并将它们加入结果字符串中。 下面给出一段完整的代码示例,展示如何通过上述方法实现中缀表达式化为后缀表达式的功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; int top; } Stack; void init_stack(Stack *s) { s->top = -1; } int is_empty(Stack *s) { return (s->top == -1); } void push(Stack *s, char c) { if (s->top >= MAX_SIZE - 1) { printf("Stack Overflow\n"); exit(EXIT_FAILURE); } s->data[++(s->top)] = c; } char pop(Stack *s) { if (is_empty(s)) { printf("Stack Underflow\n"); exit(EXIT_FAILURE); } return s->data[(s->top)--]; } int precedence(char op) { switch(op) { case '+': case '-': return 1; case '*': case '/': return 2; default : return 0; } } int main() { char infix_expr[MAX_SIZE], postfix_expr[MAX_SIZE]; Stack s; init_stack(&s); printf("Enter the Infix Expression: "); scanf("%s", infix_expr); int i = 0, j = 0; while(infix_expr[i]) { if(isalnum(infix_expr[i])) { postfix_expr[j++] = infix_expr[i++]; } else if(infix_expr[i] == '(') { push(&s, infix_expr[i++]); } else if(infix_expr[i] == ')') { while(!is_empty(&s) && s.data[s.top] != '(') { postfix_expr[j++] = pop(&s); } if (!is_empty(&s) && s.data[s.top] == '(') { pop(&s); // Remove '(' from stack } ++i; } else { // Operator encountered while(!is_empty(&s) && precedence(s.data[s.top]) >= precedence(infix_expr[i])) { postfix_expr[j++] = pop(&s); } push(&s, infix_expr[i++]); } } while(!is_empty(&s)) { postfix_expr[j++] = pop(&s); } postfix_expr[j] = '\0'; printf("Postfix Expression: %s\n", postfix_expr); return 0; } ``` 此程序实现了基本功能,能够接受用户输入的一个合法中缀算术表达式,并按照指定规则将其转换成相应的后缀形式表示出来。 #### 注意事项 - 输入应仅限于有效的数学表达式,其中包含数字、字母作为变量名以及标准四则运算符号(+,-,*,/)还有圆括号()。 - 对非法输入情况下的错误处理尚未完全覆盖,在实际应用时可能还需要增加更多健壮性的考量。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值