用栈实现计算器

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 const int N = 256;
 5 char buf[N], optr[N];
 6 int opnd[N];
 7 int opndtop,optrtop;
 8 
 9 bool isDigit(char ch)
10 {
11     return ch >='0' && ch <='9';
12 }
13 
14 int pri(char op)
15 {
16     if (op=='(') return 0;
17     if (op=='+'|| op=='-') return 1;
18     if (op=='*'|| op=='/') return 2;
19 }
20 
21 void calculate()
22 {
23     int x,y;
24     y = opnd[--opndtop];
25     x = opnd[--opndtop];
26     char op = optr[--optrtop];
27     if (op == '+') x+=y;
28     if (op == '-') x-=y;
29     if (op == '*') x*=y;
30     if (op == '/') x/=y;
31     opnd[opndtop++] = x;
32 }
33 
34 int readnum(int &i)
35 {
36     int ret = 0;
37     while (isDigit(buf[i]))
38     {
39         ret=ret*10+buf[i++]-'0';
40     }
41     return ret;
42 }
43 
44 int main()
45 {
46     scanf("%s",buf+1);
47     buf[0]='(';
48     int len = strlen(buf);
49     buf[len] = ')';
50     buf[len+1] = '\0';
51     opndtop = optrtop = 0;
52     for (int i=0; buf[i]!='\0';)
53     {
54         if (isDigit(buf[i]))
55         {
56             int x = readnum(i);
57             opnd[opndtop++] = x;
58         }
59         else
60         {
61             char op = buf[i];
62             if (op=='(')
63                 optr[optrtop++] = op;
64             else if (op==')')
65             {
66                 while (optr[optrtop-1]!='(')
67                 {
68                     calculate();
69                 }
70                 optrtop--;
71             }
72             else
73             {
74                 while (pri(op)<pri(optr[optrtop-1]))
75                 {
76                     calculate();
77                 }
78                 optr[optrtop++] = op;
79             }
80             i++;
81         }
82     }
83     printf("%d\n",opnd[opndtop-1]);
84     return 0;
85 }

 

转载于:https://www.cnblogs.com/xzenith/p/3633138.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,使用栈(Stack)实现计算器的主要目的是演示递归调用和表达式求值的基本算法,特别是后缀表达式(也称为逆波兰表示法,RPN)。这种方法不需要复杂的符号表或优先级规则,非常适合教学和理解递归。 以下是一个简单的实现后缀表达式计算器的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义数据结构 typedef struct { double num; } Number; typedef struct { char operator; Number left, right; } Expression; // 函数声明 void push(Number stack[], int &top); double pop(Number stack[], int &top); char pop_operator(Number stack[], int &top); // 后缀表达式处理函数 double evaluate_postfix(char* exp); int main() { char expression[100]; printf("Enter an expression in postfix notation: "); fgets(expression, sizeof(expression), stdin); expression[strcspn(expression, "\n")] = '\0'; // 去除末尾的换行符 double result = evaluate_postfix(expression); printf("Result: %.2lf\n", result); return 0; } // 操作 void push(Number stack[], int &top) { Number n = {atof(stack[top].num)}; top++; stack[top] = n; } double pop(Number stack[], int &top) { top--; return stack[top].num; } char pop_operator(Number stack[], int &top) { top--; return stack[top].operator; } // 表达式求值 double evaluate_postfix(char* exp) { int top = 0; Number stack[100]; // 大小可调整 stack = {'0'}; // 初始化顶为0 for (int i = 0; exp[i] != '\0'; i++) { if (isdigit(exp[i])) { push(stack, top); // 如果是数字,压入 } else { double right = pop(stack, top); double left = pop(stack, top); switch (exp[i]) { case '+': stack[top++] = {left + right}; break; case '- right}; break; case '*': stack[top++] = {left * right}; break; case '/': stack[top++] = {left / right}; break; // 添加其他运算符处理 } } } return pop(stack, top); // 返回结果 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值