现在的位置: 首页 > 综合 > 正文

后缀式求值SDUT 2133

2012年04月05日 ⁄ 综合 ⁄ 共 1536字 ⁄ 字号 评论关闭

是纯C写的

下午把数据结构上的后缀式求值程序敲了敲,发现怎么计算答案都是-48, 调试了一下,发现就是在结尾那时,书本以‘ ’空格来作结尾,以用C语言的scanf,gets来读取字符串是以‘\0’结尾的。导致运算错误。

后缀式求值主要是用栈的知识

收获:


scanf :当遇到回车,空格和tab键会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。

 


gets:可接受回车键之前输入的所有字符,

自动在字符串后面添加'\0,

回车键不会留在输入缓冲区中

 

 

cin:读入字符串string,不会在字符串后面添加任何东西

 

 

 

顺带在OJ找了与此相关题做了做

附上代码

 

代码

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  

 

 

抱歉!评论已关闭.