您的位置:首页 > 编程语言 > C语言/C++

用C++实现中缀表达式求值即简单科学计算器的功能

2017-05-09 17:15 411 查看
用两个栈实现计算机加减乘除简易的计算器,一个栈乘数字,一个栈乘加减乘除号包括括号,通过出栈入栈来实现功能

#include <iostream>
#include <string>
using namespace std;
template <class T>
class myStack
{
private:
T *elements;
int top;
int maxSize;
public:
myStack(int maxSize)
{
elements = new T[maxSize];
this->maxSize = maxSize;
top = -1;
}
bool isFull()
{
if(top==maxSize-1) return true;
else return false;
}
bool isEmpty()
{
if(top== -1) return true;
else return false;
}
T pop()
{
if(isEmpty())return -1;
else
{
top--;
return elements[top+1];
}
}
bool push(T x)
{
if(isFull()) return false;
else
{
top++;
elements[top] = x;
return true;
}
}
int getSize()
{
return top+1;
}
T getTop()
{
return elements[top];
}
};
int calculate(int a,int b,int c)
{
switch(c)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
default:
return 0;
}
}
char compare(char a1,char a2)
{
if(a1=='+'&&a2=='+')return '>';
else if(a1=='+'&&a2=='-') return '>';
else if(a1=='+'&&a2=='*') return '<';
else if(a1=='+'&&a2=='/')return '<';
else if(a1=='+'&&a2=='(')return '<';
else if(a1=='+'&&a2==')')return '>';
else if(a1=='+'&&a2=='#')return '>';
else if(a1=='-'&&a2=='+')return '>';
else if(a1=='-'&&a2=='-')return '>';
else if(a1=='-'&&a2=='*')return '<';
else if(a1=='-'&&a2=='/')return '<';
else if(a1=='-'&&a2=='(')return '<';
else if(a1=='-'&&a2==')')return '>';
else if(a1=='-'&&a2=='#')return '>';
else if(a1=='*'&&a2=='+')return '>';
else if(a1=='*'&&a2=='-')return '>';
else if(a1=='*'&&a2=='*')return '>';
else if(a1=='*'&&a2=='/')return '>';
else if(a1=='*'&&a2=='(')return '<';
else if(a1=='*'&&a2==')')return '>';
else if(a1=='*'&&a2=='#')return '>';
else if(a1=='/'&&a2=='+')return '>';
else if(a1=='/'&&a2=='-')return '>';
else if(a1=='/'&&a2=='*')return '>';
else if(a1=='/'&&a2=='/')return '>';
else if(a1=='/'&&a2=='(')return '<';
else if(a1=='/'&&a2==')')return '>';
else if(a1=='/'&&a2=='#')return '>';
else if(a1=='('&&a2=='+')return '<';
else if(a1=='('&&a2=='-')return '<';
else if(a1=='('&&a2=='*')return '<';
else if(a1=='('&&a2=='/')return '<';
else if(a1=='('&&a2=='(')return '<';
else if(a1=='('&&a2==')')return '=';
else if(a1==')'&&a2=='+')return '>';
else if(a1==')'&&a2=='-')return '>';
else if(a1==')'&&a2=='*')return '>';
else if(a1==')'&&a2=='/')return '>';
else if(a1==')'&&a2==')')return '>';
else if(a1==')'&&a2=='#')return '>';
else if(a1=='#'&&a2=='+')return '<';
else if(a1=='#'&&a2=='-')return '<';

4000
else if(a1=='#'&&a2=='*')return '<';
else if(a1=='#'&&a2=='/')return '<';
else if(a1=='#'&&a2=='(')return '<';
else if(a1=='#'&&a2=='#')return '=';
else return ' ';
}
bool isChar(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')return true;
else return false;
}
int EvaluateExpression(string expression)
{
int result;
myStack<int> *numStack = new myStack<int>(100);
myStack<char> *charStack = new myStack<char>(100);
charStack->push('#');
int i= 0;
while(i<expression.length())
{
int temp=0;
bool flag = false;
while(expression[i]>='0' &&expression[i]<='9')
{
temp = temp*10+expression[i]-'0';
i++;
flag = true;

}
if(flag==true)
{
flag = false;
numStack->push(temp);
}
if(isChar(expression[i]))
{
switch(compare(charStack->getTop(),expression[i]))
{
case '<':
charStack->push(expression[i]);
i++;
break;
case '=':
charStack->pop();
i++;
break;
case '>':
int a = numStack->pop();
int b = numStack->pop();
char c = charStack->pop();
result= calculate(b,a,c);
numStack->push(result);
break;
}
}
}
return numStack->pop();
}
int main()
{
string a;
for(;;)
{
cout<<"[0]退出程序\n[1]计算表达式"<<endl;
int i;
cin>>i;
if(i==0)break;
else
{
cout<<"请输入要表达的计算式"<<endl;
cin>>a;
a+='#';
cout<<EvaluateExpression(a)<<endl;
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: