• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

后缀式求值SDUT 2133

是纯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  

 

 

posted on 2010-09-01 17:12  sysuwhj  阅读(316)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3