</pre><pre name="code" class="cpp">#include<stack>
#include<iostream>
#include<deque>
#include<string>
#include <assert.h>
using namespace std;
/*
bool isLegalChar(char c)
{
if(!isdigit(c)&&c!='('&&c!=')'&&c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!=' '&&c!='\t'&&c!='\n')
return false;
else
return true;
}
*/
int getPriority(char c)
{
switch(c)
{
case '+':
case '-':
return 0;
break;
case '*':
case '/':
return 1;
break;
case '(':
case ')':
return -1;
break;
}
}
void calhouzui(deque<char>& inputStr,deque<char>& signStr, deque<int>& outputStr)
{
stack<int> tempStr;
while(!inputStr.empty())
{
char c = inputStr.front();
inputStr.pop_front();
if(isdigit(c))
outputStr.push_back(c);
else
{
if(c==' '||c=='\t');
else if(c=='(')
signStr.push_back(c);
else if(c==')')
{
while(signStr.back()!='(')
{
outputStr.push_back(signStr.back());
signStr.pop_back();
}
signStr.pop_back();
}
else
{
while(!signStr.empty()&&(getPriority(c)<=getPriority(signStr.back()))) {
char sym=signStr.back();
signStr.pop_back();
outputStr.push_back(sym);
}
signStr.push_back(c);
}
}
}
while(!signStr.empty())
{
outputStr.push_back(signStr.back());
signStr.pop_back();
}
}
int calculat(deque<int>& outputStr)
{
stack<int> tempStack;
while(!outputStr.empty())
{
int c = outputStr.front();
outputStr.pop_front();
if(isdigit(c))
tempStack.push(c-48);
else
{
int op1 = tempStack.top();
tempStack.pop();
int op2 = tempStack.top();
tempStack.pop();
switch(c)
{
case '+':
tempStack.push(op2+op1);
break;
case '-':
tempStack.push(op2-op1);
break;
case '*':
tempStack.push(op2*op1);
break;
case '/':
tempStack.push(op2/op1);
break;
}
}
}
return tempStack.top();
}
int expr(const string str)
{
deque<char> inputStr;
for(int i=0;i!=str.size();++i)
inputStr.push_back(str[i]);
deque<char> signStr;
deque<int> outputStr;
calhouzui(inputStr,signStr,outputStr);
return calculat(outputStr);
}
int main()
{
assert(expr("1") == 1);
assert(expr("1+2") == 3);
assert(expr("3-2") == 1);
assert(expr("1+2+3") == 6);
assert(expr("1+2-3") == 0);
assert(expr("(1+2)-3") == 0);
assert(expr("3-2- 1") == 0);
assert(expr("(4-(2+1))*4-1") == 3);
}
简易四则计算
最新推荐文章于 2021-10-22 00:54:31 发布