经典题.题目描述:
1005: 算术表达式的求值
Time Limit: 1 Sec Memory Limit: 65535 MB 64bit IO Format: %lld
Description
通过程序来完成任意算术表达式的求值。表达式中包含的运算符包括+,-,*,/,()等5类。运算对象均为整数。
Input
包含多组测试数据。每组测试数据一个算术表达式,占一行。每个表达式不超过100个字符。
Output
输出每个算术表达式的计算结果(按照C语言运算规则),一个结果占一行。
Sample Input 4+23-10/5
3(7-2)
2*3/2
Sample Output
8
15
3
解题思路:
1.转换为后缀表达式例如3x5+4x6->3 5 x 4 6 x +。
2.优先级高的运算放在前面,先操作,也如上3546的操作,优先级高的后入栈,以之后入队操作先行入队。
3.括号的处理问题,本题最大难点好像也就是这里了。这里处理的方法是:单独将括号这个部分扒出来,括号结束后该部分运算直接入队,尽可能地放到前面进行运算,这样便确保了括号运算的优先级问题。
4.优先级错乱的处理。也如上述例子,‘+’位于‘x’之间,则先将‘x’入栈,遇到‘+’后‘x’直接入队,则前面的‘x’在后面的‘+’之前运算,之后的一个‘x’优先级顺序排到栈顶,之后入队也是先运算。
5.字符串数字的处理。利用函数atoi(char*)可将可将形如‘1’,‘2’,‘3’的字符串数组转换为数字123.
AC代码及注释如下:
#include<bits/stdc++.h>
using namespace std;
queue<char> q;
stack<char> s;stack<int> s1;
char a[1000];char str[1000];
int adv(char ch)//判断优先级,注意这里只要先乘除后加减就可以了,相同优先级直接交换计算顺序无影响
{
if(ch == '+' || ch == '-')return 1;
if(ch=='*'||ch =='/')return 2;
return 0;
}
int main()
{
int i,tmp,k;
while(~scanf("%s",a))
{
int len=strlen(a);//将中缀表达式变为后缀表达式,放在队列中
for(i=0;i<len;i++)//字符串解析
{
if(a[i]>='0'&&a[i