首页 > 代码库 > 正常表达式求值

正常表达式求值

 

编写一个程序求正常表达式的值

例:5+6*9 (中间没有空格)

下面是表达式的定义

技术分享

显然这是一个间接的递归

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 using namespace std;
 5 
 6 int expression_value();
 7 int term_value();
 8 int factor_value();
 9 
10 int main()
11 {
12     printf("%d\n",expression_value());
13     return 0;
14 }
15 int expression_value()//表达式
16 {
17     int more = 1;
18     int result = term_value();//第一项的值
19     char op;
20     while(more){//如果是不断用 + - 连接 则不断进行循环
21     op = cin.peek();//从流输入中复制到OP中 不是 取走
22     if(op == + || op == -)
23     {
24         cin.get();
25         if(op == +)
26         result+=term_value();//如果是 + - 就 + - 下一项的值
27         else
28         result-=term_value();
29     }
30     else more = 0; // 如果不是+ - 则停止循环 
31     }
32     return result;
33 }
34 int term_value()
35 {
36     int more = 1;
37     int result = factor_value();
38     char op;
39     while(more){
40     op = cin.peek();
41     if(op == * || op == /)
42     {
43         cin.get();
44         if(op == *)
45             result *= factor_value();
46         else
47             result /= factor_value();
48     }
49     else more = 0;
50     }
51     return result;
52 }
53 
54 int factor_value()
55 {
56     int result = 0;
57     int op;
58     op = cin.peek();
59     if(op == (){
60         cin.get();
61         result += expression_value();
62         cin.get();
63     }
64     else
65         while(isdigit(op)) //检验字符是否是阿拉伯数字
66         {
67             result = result * 10 + op - 0; // 每多输入一位 相当于 之前输入的数字大十倍 并且加上 刚才输入的数
68             cin.get();
69             op = cin.peek();
70         }
71     return result;
72 }

cin.peek() 从流输入中复制到一个对象中 并不是取走 此时流输入没有变化

cin.get() 从流输入中取走一个字符

isdigit() 检验char型对象中的值是否为阿拉伯数字 若是‘5‘则返回1 ‘P‘则返回0

 

正常表达式求值