后缀式求值SDUT 2133
是纯C写的
下午把数据结构上的后缀式求值程序敲了敲,发现怎么计算答案都是-48, 调试了一下,发现就是在结尾那时,书本以‘ ’空格来作结尾,以用C语言的scanf,gets来读取字符串是以‘\0’结尾的。导致运算错误。
后缀式求值主要是用栈的知识
收获:
scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符,
自动在字符串后面添加'\0,
回车键不会留在输入缓冲区中
cin:读入字符串string,不会在字符串后面添加任何东西
顺带在OJ找了与此相关题做了做
附上代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h>
2
3
4
5 const int MAX_STACK_SIZE = 100;
6
7 int stack[MAX_STACK_SIZE];
8 char expr[MAX_STACK_SIZE];
9 typedef enum{ lparen, rparen, plus, minus, times, divide, mod, eos, operand} precedence;
10
11 void add(int *top, int item)
12 {
13 if (*top >= MAX_STACK_SIZE)
14 return;
15 stack[++*top] = item;
16 }
17
18 int deleteint(int *top)
19 {
20 if(*top == -1)
21 return 0;
22 return stack[(*top)--];
23 }
24
25 precedence get_token(char *symbol, int *n)
26 {
27
28
29 *symbol = expr[(*n)++];
30
31 switch(*symbol)
32 {
33 case '(': return lparen;
34 case ')': return rparen;
35 case '+': return plus;
36 case '-': return minus;
37 case '*': return times;
38 case '/': return divide;
39 case '%': return mod;
40 case '#': return eos;//结尾标志
41 default: return operand;
42 }
43
44
45 }
46
47 int eval()
48 {
49 precedence token;
50 char symbol;
51 int op1, op2;
52 int n = 0;
53 int top = -1;
54 token = get_token(&symbol, &n);
55
56 while(token != eos)
57 {
58 if(token == operand)
59 add(&top, symbol - '0');
60 else
61 {
62 op2 = deleteint(&top);
63 op1 = deleteint(&top);
64
65 switch(token)
66 {
67 case plus: add(&top, op1+op2);
68 break;
69 case minus: add(&top, op1 - op2);
70 break;
71 case times: add(&top, op1 * op2);
72 break;
73 case divide: add(&top, op1 / op2);
74 break;
75 case mod: add(&top, op1 % op2);
76 break;
77 }
78 }
79
80 token = get_token(&symbol, &n);
81 }
82 return deleteint(&top);
83 }
84
85 int main()
86 {
87 scanf("%s", expr);
88 printf("%d", eval());
89 return 0;
90
91 }
92