#include "iostream"
#include "arrStack.h" //用到了上篇文章定義的順序棧模板
using namespace std;
double fun(double x,double y,char op)
{
switch(op)
{
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
}
}
int main()
{
const int size=50;
//arrStack<double> result(size); //開始計劃使用兩個棧,現在只使用一個num棧來
arrStack<double> num(size);
cout<<"請輸入後綴表達式(必須以數字開頭,以等號結尾,數字與數字以及數字與運算符間必須譯空格隔開):"<<endl;
char ep[50]; //表達式expression
cin.getline(ep,50);
int i=0;
int count=0; //技術控制
int control=0; //控制變量,控制運算符後面空格的輸出。
while(ep[i])
{
// int count=0;
if(ep[i]!=' ')
{
if(ep[i]>='0'&&ep[i]<='9')
{
num.push(ep[i]-'0');
count++;
}
if(ep[i]=='+'||ep[i]=='-'||ep[i]=='*'||ep[i]=='/')
{
double num1;
//result.pop(num1);
num.pop(num1);
double num2;
//result.pop(num2);
num.pop(num2);
double tmp=fun(num2,num1,ep[i]);
num.push(tmp);
//result.push(tmp);
control=1;
}
if(ep[i]=='=')
{
double tmp;
//result.pop(tmp);
num.pop(tmp);
cout<<ep<<tmp<<endl;
}
}
else
{
if(control==0)
{
double tmp;
double tmpNum;
//for(double k=0;k<count;k++)
//{
// double tmpNum;
// num.pop(tmpNum);
// tmp+=tmpNum*pow(10,k);
//}
if(count==1)
{
num.pop(tmpNum);
tmp=tmpNum;
}
else
{
num.pop(tmpNum);
tmp=tmpNum;
for(int i=1;i<count;i++)
{
int j=i;
num.pop(tmpNum);
//while(i--) //錯誤地方,以後注意。
while(j--)
{
tmpNum*=10;
}
tmp+=tmpNum;
}
}
num.push(tmp);
//result.push(tmp);
count=0;
}
else
{
control=0;
}
}
i++;
//cout<<"result:";
//result.print();
cout<<"num:";
num.print();
cout<<endl;
}
return 0;
}