利用栈结构来实现计算器功能

我们在日常生活中一般使用的是中缀表达式,即a*b的形式,其特点是操作符位于中间位置,中缀表达式虽然方便阅读理解,但是无法判断优先级,只能按顺序一个一个算下去,这样是不利于程序进行计算的,所以计算器算法的原理是将中缀表达式转换为后缀表达式,然后进行计算。后缀表达式的特点是操作符位于后面位置,如a b *。

计算器的实现需要借助两个栈结构,一个是数字栈,一个是符号栈。首先数字按顺序进栈,当读到运算符时,弹出两个数字进行运算,再把结果进栈。当读到一个数的时候,立即把他放到输入中。符号不立即输出,而是放入栈中。当遇见右括号时,我们就把栈的元素弹出,直到遇见一个左括号。如果遇见其他符号(“+ - * / ”),我们就从栈中弹出元素直到发现优先级更低的元素。

我们的要求是,优先级高的要先进行运算,后缀表达式是只有在遇到运算符时才弹出两个数进行运算,那么我们要做的就是把优先级最高的最先弹出,在有加减乘除和括号的运算中,括号的优先级无疑是最高的,所以遇到右括号时就可以直接弹出直到遇到左括号,遇到其他符号时就先存放在栈中,然后,当一个优先级低的元素要进栈时,优先级较高的运算符就必须先弹出来进行运算。至于优先级相同的,则遵循先后原则,栈里面的元素先出现,就弹出先进行运算。到最后栈中还剩下的运算符,由于后面没有运算符了,而栈中的运算符本来就是按照优先顺序排序的,所以就直接按顺序弹出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来回答你的问题。 首先,我们需要定义一个结构来存储数字和运算符。这个可以使用数组来实现,同时需要定义顶指针。 然后,我们可以通过读入用户输入的表达式,逐个字符进行处理。当读入的字符是数字时,直接将其入。当读入的字符是运算符时,从中弹出两个数进行计算,然后将计算结果入。 具体的实现过程可以参考下面的代码: ```c #include <stdio.h> #define MAXSIZE 100 typedef struct { int top; int data[MAXSIZE]; } Stack; void initStack(Stack *s) { s->top = -1; } void push(Stack *s, int x) { s->top++; s->data[s->top] = x; } int pop(Stack *s) { int x = s->data[s->top]; s->top--; return x; } int isEmpty(Stack *s) { return s->top == -1; } int main() { Stack s; initStack(&s); char c; int num = 0; int flag = 0; while ((c = getchar()) != '\n') { if (c >= '0' && c <= '9') { num = num * 10 + c - '0'; flag = 1; } else if (flag) { push(&s, num); num = 0; flag = 0; } if (c == '+') { int a = pop(&s); int b = pop(&s); push(&s, a + b); } } printf("%d\n", pop(&s)); return 0; } ``` 在这个代码中,我们定义了一个结构,包括初始化、入、出、判断空等基本操作。然后,我们读入用户输入的表达式,逐个字符进行处理。当读入的字符是数字时,将其保存在一个变量中,等到下一个字符不是数字时,将这个变量入。当读入的字符是运算符时,从中弹出两个数进行计算,然后将计算结果入。最后,输出顶元素即为计算结果。 当然,这个代码只能处理加法运算,如果需要支持更多的运算符,需要进行相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值