中缀表达式值
2018-06-17 22:59:14来源:未知 阅读 ()
1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 int number[101],i=0, p=1; 7 char symbol[101],s[256],t[256]; 8 void push() //算符入栈运算 9 { 10 symbol[++p]=s[i]; 11 } 12 void pop() //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算 13 { 14 switch (symbol[p--])//运算完成之后扔掉运算符,也标志着需要运算的数已经运算完成 15 { 16 case '+': 17 { 18 number[p]+=number[p + 1]; 19 break; 20 } 21 case '-': 22 { 23 number[p]-=number[p + 1]; 24 break; 25 } 26 case '*': 27 { 28 number[p]*=number[p + 1]; 29 break; 30 } 31 case '/': 32 { 33 number[p]/=number[p + 1]; 34 break; 35 } 36 case '^': 37 { 38 number[p]=pow(number[p],number[p + 1]); 39 } 40 } 41 } 42 bool can() //判断运算符的优先级别,建立标志函数,能否进行运算 43 { 44 if ((s[i]=='+'||s[i]=='-')&&symbol[p]!='(') //在括号之内 45 return 1; 46 if ((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/')) 47 //若遇到乘除且p对应的恰好是乘除 48 return 1; 49 return 0; 50 } 51 bool judge(char s[256]) 52 { 53 int top=0,i=0; 54 while (s[i]!='@') 55 { 56 if (s[i]=='(') top++; 57 if (s[i]==')') 58 { 59 if (top>0) top--; 60 else return 0; 61 } 62 i++; 63 } 64 if (top!=0) return 0; //检测栈是否为空。不空则说明有未匹配的括号 65 else return 1; 66 } 67 int main() 68 { 69 gets(s); 70 if(judge(s)==0) 71 { 72 cout<<"NO"; 73 return 0; 74 } 75 76 s[strlen(s)]=')'; 77 symbol[p]='('; 78 while (i<strlen(s)) 79 { 80 while (s[i]=='(') //左括号处理,压入左括号,有了左括号才能进行与右括号的匹配 while (symbol[p]!='(') 81 { 82 push(); 83 i++; 84 } 85 int x=0; 86 while (s[i]>='0'&&s[i]<='9') //取数入操作数栈 87 x=x*10+s[i++]-'0'; 88 number[p]=x; 89 do 90 { 91 if (s[i]==')') //当右括号后面还有右括号时处理 92 { 93 while (symbol[p]!='(') 94 pop();//当括号内还有算式没有算完时进行运算 95 number[--p]=number[p + 1];//当运算完成以后左括号已经没有意义,所以将指针p移向前一个运算符,并复制所得的结果 96 } 97 else 98 { //根据标志函数值作运算符入栈或出栈运算处理 99 while (can()) 100 pop();// 当可以进行运算时运算,然后压入一个运算符 101 push(); 102 } 103 i++; 104 }while (i<strlen(s)&&s[i-1]==')');//当检测到右括号时,可以运算括号内的内容 105 } 106 printf("Result=%d", number[0]);//因为所有的运算全部是建立在括号之内的,所以随着运算符的减少(运算符减少同时标志着需要操作的数减少)和最后的p--,结果一定保存在number[0]内 107 return 0; 108 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:STL容器之优先队列(转)
- C++98/11/17表达式类别 2020-05-23
- 表达式·表达式树·表达式求值 2020-04-29
- 定位new表达式与显式调用析构函数 2020-04-20
- 【题解】Luogu1739 表达式括号匹配 2020-04-07
- C++之四则运算表达式求值 2019-11-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash