http://blog.csdn.net/liuzhustu/
#include <iostream>
#include<cstring>
#include<cstdlib>
#include<string>
#include <sstream>
#include <algorithm>
using namespace std;
class ArrayStackofInt{
private:
int maxsize;
int top;
int *st;
public:
ArrayStackofInt(int size)
{
maxsize=size;
top=-1;
st=new int [maxsize];
}
ArrayStackofInt()
{
top=-1;
}
~ArrayStackofInt()
{
delete[] st;
}
void clear()
{
top=-1;
}
bool Push(const int item)
{
if(top==maxsize-1)
{
int *newSt=new int [maxsize*2];
for(int i=0;i<=top;i++)
{
newSt[i]=st[i];
}
delete []st;
st=newSt;
maxsize *=2;
}
st[++top]=item;
return true;
}
bool Pop(int & item)
{
if(top==-1)
{
cout<<"the stack is empty"<<endl;
return false;
}
item=st[top--];
return true;
}
bool Top(int & item)
{
if(top==-1)
{
cout<<"the stack is empty,No element can top"<<endl;
return false;
}
item=st[top];
return true;
}
};
class ArrayStackofChar{
private:
int maxsize;
int top;
char *st;
public:
ArrayStackofChar(int size)
{
maxsize=size;
top=-1;
st=new char[maxsize];
}
ArrayStackofChar()
{
top=-1;
}
~ArrayStackofChar()
{
delete[] st;
}
void clear()
{
top=-1;
}
bool Push(const char item)
{
if(top==maxsize-1)
{
char* newSt=new char [maxsize*2];
for(int i=0;i<=top;i++)
{
newSt[i]=st[i];
}
delete []st;
st=newSt;
maxsize *=2;
}
st[++top]=item;
return true;
}
bool Pop(char & item)
{
if(top==-1)
{
cout<<"the stack is empty"<<endl;
return false;
}
item=st[top--];
return true;
}
bool Top(char & item)
{
if(top==-1)
{
cout<<"the stack is empty"<<endl;
return false;
}
item=st[top];
return true;
}
bool IsEmpty()
{
return top==-1;
}
};
ArrayStackofChar op(10);
ArrayStackofInt number(10);
class Calculator{
public:
double calculate(string InfixExp);
string infix_suffix(string InfixExp);
double cal_suffix(string PostfixExp);
double cal(double num1,double num2,char op);
};
double Calculator::calculate(string InfixExp)
{
string PostfixExp=infix_suffix(InfixExp);
return cal_suffix(PostfixExp);
}
double Calculator::cal_suffix(string PostfixExp)
{ cout<<PostfixExp<<endl;
int i=0;
int num1;
int num2;
int result;
while(PostfixExp[i]!='\0')
{
switch(PostfixExp[i])
{
case '1':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
cout<<result<<endl;
number.Push(result);
break;
}
case '2':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
cout<<result<<endl;
number.Push(result);
break;
}
case '3':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
cout<<result<<endl;
number.Push(result);
break;
}
case '4':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
cout<<result<<endl;
number.Push(result);
break;
}
case '5':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
number.Push(result);
break;
}
case '6':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
number.Push(result);
break;
}
case '7':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
number.Push(result);
break;
}
case '8':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
number.Push(result);
break;
}
case '9':
{ string num;
while(PostfixExp[i]>=48&&PostfixExp[i]<=57)
{
num+=PostfixExp[i];
i++;
}
stringstream ss;
ss<<num;
ss>>result;
cout<<result<<endl;
number.Push(result);
break;
}
case '+':
{
number.Pop(num1);
number.Pop(num2);
result=cal(num1,num2,'+');
number.Push(result);
break;
}
case '-':
{
number.Pop(num2);
number.Pop(num1);
result=cal(num1,num2,'-');
number.Push(result);
break;
}
case '*':
{
number.Pop(num1);
number.Pop(num2);
result=cal(num1,num2,'*');
number.Push(result);
break;
}
case '/':
{
number.Pop(num2);
number.Pop(num1);
result=cal(num1,num2,'/');
number.Push(result);
break;
}
}
i++;
}
//number.Top(result);
cout<<"num1 "<<num1<<" num2 "<<num2<<endl;
return result;
}
string Calculator::infix_suffix(string InfixExp)
{
int i=0;
string PostfixExp;
while(InfixExp[i]!='\0')
{
switch(InfixExp[i])
{
case '1':
PostfixExp+=InfixExp[i];
break;
case '0':
PostfixExp+=InfixExp[i];
break;
case '2':
PostfixExp+=InfixExp[i];
break;
case '3':
PostfixExp+=InfixExp[i];
break;
case '4':
PostfixExp+=InfixExp[i];
break;
case '5':
PostfixExp+=InfixExp[i];
break;
case '6':
PostfixExp+=InfixExp[i];
break;
case '7':
PostfixExp+=InfixExp[i];
break;
case '8':
PostfixExp+=InfixExp[i];
break;
case '9':
PostfixExp+=InfixExp[i];
break;
case '(':
{
PostfixExp+=" ";
op.Push(InfixExp[i]);
break;
}
case ')':
{
PostfixExp+=" ";
char temp;
op.Top(temp);
if(op.IsEmpty())
{
op.clear();//此处抛异常
break;
}
while(temp!='(')
{ op.Pop(temp);
PostfixExp+=temp;
op.Top(temp);
}
if(temp=='(')
{
op.Pop(temp);
}
if(op.IsEmpty())
{
op.clear();//此处抛异常
break;
}
break;
}
case '+':
{
PostfixExp+=" ";
char temp=' ';
if(!op.IsEmpty())
{
op.Top(temp);
}
while(!op.IsEmpty()&&temp!='(')
{ op.Pop(temp);
PostfixExp+=temp;
if(!op.IsEmpty())
{
op.Top(temp);
}
}
op.Push(InfixExp[i]);
break;
}
case '-':
{
PostfixExp+=" ";
char temp=' ';
if(!op.IsEmpty())
{
op.Top(temp);
}
while(!op.IsEmpty()&&temp!='(')
{ op.Pop(temp);
PostfixExp+=temp;
op.Top(temp);
}
op.Push(InfixExp[i]);
break;
}
case '*':
{
PostfixExp+=" ";
char temp=' ';
if(!op.IsEmpty())
{
op.Top(temp);
}
while(!op.IsEmpty()&&temp!='('&&(temp=='*'||temp=='/'))
{ op.Pop(temp);
PostfixExp+=temp;
op.Top(temp);
}
op.Push(InfixExp[i]);
break;
}
case '/':
{
PostfixExp+=" ";
char temp=' ';
if(!op.IsEmpty())
{
op.Top(temp);
}
while(!op.IsEmpty()&&temp!='('&&(temp=='*'||temp=='/'))
{ op.Pop(temp);
PostfixExp+=temp;
op.Top(temp);
}
op.Push(InfixExp[i]);
break;
}
}
i++;
}
if(!op.IsEmpty())
{
char temp=' ';
string rev;
while(!op.IsEmpty()&&temp!='(')
{ PostfixExp+=" ";
op.Pop(temp);
rev+=temp;
}
// reverse(rev.begin(),rev.end());
PostfixExp+=rev;
}
return PostfixExp;
}
double Calculator::cal(double num1,double num2,char op)
{
if(op=='+')
{
return num1+num2;
}
if(op=='-')
{
return num1-num2;
}
if(op=='*')
{
return num1*num2;
}
if(op=='/')
{ if(num2==0)
{
cout<<"num2==0,Exception"<<endl;
return 0;
}
return num1/(num2*1.0);
}
}
int main()
{
Calculator c;
double d=c.calculate("(5*6)-2+3*2/2+(1*1)");
cout<<d<<endl;
return 0;
}
利用栈实现计算器,先转换为逆波兰式之后运算
最新推荐文章于 2020-04-19 23:50:26 发布