C语言数据结构篇——用栈实现四则运算

1、遵循的原则


中缀表达式转后缀表达式的数据用栈来存储,在遍历中缀表达式的时遵循以下原则:

●对于数字,直接输出

●对于符号:

左括号:不管栈中是否有元素直接进栈

运算符:若栈为空:直接进栈

               若栈中有元素,则与栈顶符号进行优先级比较;

                        若新符号优先级高(默认左括号优先级最低),则直接入栈;

                        否则就需要弹 出并输出栈顶元素,并将新符号压栈,

右括号:不断将栈顶符号弹出并输出,直到栈顶符号与右括号匹配(即栈顶符号是左括号),再讲栈顶的左括号弹出即可(只需要弹出,不需要输出)

优先级大小:乘除号>加减号>左括号

●遍历结束后,将栈内的元素全部弹出并输出

2. 图文举例

第一步:遍历中缀表达式,第一个读取到的字符是3,按照转换的原则“数字直接输出”,所以将‘3’直接添加到我们的结果中,如图:

第二步: 第二个读取到的字符是‘+’,为运算符,此时栈中为空,所以直接将‘+’入栈,如图:

 

第三步:遍历到‘4’,与第一步同理,数字直接输出,所以将‘4’添加到结果中,此时结果为3 4; 

第四步:遍历到‘*’,栈不为空,所以与栈顶元素比较优先级,此时栈顶元素为‘+’,‘*’的优先级比‘+’号高,所以还是将‘*’直接入栈。

第五步: 此时遍历到了‘(’,因为“左括号直接入栈”,所以同前一步一样,将‘(’入栈即可。

第六步:此时遍历到了‘’7”,是数字,同理与,第一步一样,将‘7’添加到结果中,此时结果为

 第七步:此时遍历到了‘-’,是运算符,所以需要与栈顶的‘(’比较优先级大小,‘-’的优先级高,所以将‘-’直接压栈即可。

第八步:此时遍历到了‘2’,是数字所以继续将‘2’添加到结果,此时遍历情况与结果如图:

 第九步:遍历到了‘)’ ,所以需要进行括号匹配,从栈中不断弹出并输出栈顶元素,直到匹配到的栈顶元素是左括号,再将左括号弹出即可,具体步骤如图

 第十步:中缀表达式已经遍历完,但栈中还有元素,所以将栈中全部元素弹出并输出(添加到结果中)即可,最后如图

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用栈实现四则运算表达式的计算。具体步骤如下: 1. 定义一个结构,用于存放运算符和数字。 2. 读入表达式字符串,逐个字符进行处理。 3. 遇到数字字符时,将其转换为数字并压入中。 4. 遇到运算符时,从中弹出两个数字进行计算,并将结果压入中。 5. 最后中只剩下一个数字,即为表达式的计算结果。 下面是使用C语言实现的应用栈实现四则运算的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 50 typedef struct { int top; int data[MAX_SIZE]; } Stack; void push(Stack *stack, int value) { if (stack->top == MAX_SIZE) { printf("Error: stack overflow\n"); exit(1); } stack->data[++stack->top] = value; } int pop(Stack *stack) { if (stack->top == -1) { printf("Error: stack underflow\n"); exit(1); } return stack->data[stack->top--]; } int calculate(char *expr) { Stack stack = {-1}; char *p = expr; while (*p != '\0') { if (*p >= '0' && *p <= '9') { int num = 0; while (*p >= '0' && *p <= '9') { num = num * 10 + (*p - '0'); p++; } push(&stack, num); } else if (*p == '+' || *p == '-' || *p == '*' || *p == '/') { int b = pop(&stack); int a = pop(&stack); switch (*p) { case '+': push(&stack, a + b); break; case '-': push(&stack, a - b); break; case '*': push(&stack, a * b); break; case '/': if (b == 0) { printf("Error: divide by zero\n"); exit(1); } push(&stack, a / b); break; } p++; } else { printf("Error: invalid character '%c'\n", *p); exit(1); } } if (stack.top != 0) { printf("Error: invalid expression\n"); exit(1); } return pop(&stack); } int main() { char expr[100]; printf("请输入四则运算表达式:"); scanf("%s", expr); int result = calculate(expr); printf("计算结果:%d\n", result); return 0; } ``` 在程序中,我们定义了一个结构 Stack,包含一个指向顶的 top 指针和一个数组 data 用于存放中的元素。push 函数实现元素的入,pop 函数实现元素的出。calculate 函数接收一个字符串类型的表达式,逐个字符进行处理,并使用栈来计算表达式的值。 使用示例: ``` 请输入四则运算表达式:3+4*2/(1-5)^2 计算结果:3 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值