//*************************************************************************************************************************
//算数表达式计算
//实现正整数的+-*/运算.
//*************************************************************************************************************************
#include <iostream.h>
#include<string.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdio.h>
//*************************************************************************************************************************
//类模版定义
template <class T>
class Expression
{
private:
T *base;
T *top;
int stacksize;
public:
Expression();//建立一个新栈
Push(T e);//压入一个新数据
GetTop();//取得最上面的数据
Pop();//弹出最上面的数据
};
template <class T>
Expression <T>::Expression()
{
base = (T*)malloc(100*sizeof(T));
if(!base)
exit (0);//分配内存失败
top=base;
stacksize = 100;
}
template <class T>
int Expression <T>::GetTop()
{
T e;
if(top==base)
return 0;//栈空的情况
e=*(top-1);
return e;
}
template <class T>
int Expression <T>::Pop()
{
T e;
if(top==base)
return 0;//栈空的情况
e=* --top;
return e;
}
template <class T>
int Expression <T>::Push(T e)
{
if(top-base>=stacksize)//栈满的情况
{
cout<<"空间不足!!"<<endl;
exit (0);//空间分配失败
}
*top++=e;
return 1;
}
/*class Expreesion
{
private:
SqStack<int> r;
int result ;
public:
Expreesion()
{
this->result=r.GetTop
}
int store()
{
return result;
}
}
*/
//************************************************************************************************************************
//基本函数定义
char del() //去除前导空格函数
{ char c;
c=getchar();
while(c==' ')
{
c=getchar();
}
return c;
}
int Isnum(char e)//判断是否是数字
{
if(e>='0'&&e<='9')
return 1;
else
return 0;
}
int Primary(char x)//返回符号对应的数值
{
int e=-1;
switch (x)
{
case '+': e=0;break;
case '-': e=1;break;
case '*': e=2;break;
case '/': e=3;break;
case '(': e=4;break;
case ')': e=5;break;
case '#': e=6;break;
case '=': e=6;break;
}
if(e==-1)
{
cout<<"输入表达式含不规范字符!" <<endl;
exit(0);
}
return e;
}
int Precede(char x,char y) //符号优先级定义
{
int num[7][7]={{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}};
int a,b;
a = Primary(x);
b = Primary(y);
return num[a][b];
}
int Operate(int a ,char op ,int b )
{
if (op =='+')
return (a+b);
if (op =='-')
return (a-b);
if (op =='*')
return (a*b);
if (op =='/')
return (a/b);
}
void Cal()
{
Expression <int> OPND;//操作数栈
Expression <char> OPTR;//运算符栈
char c,d;
int num;
//c=del();
OPTR.Push('#');//将#压入运算符栈
// cout<<"/t/tOPTR 进栈: "<<c<<endl;
c=del();
while (c!='='||OPTR.GetTop()!='#')
{
if(Isnum(c))
{
num = int(c-48);
d=del();//读入下一字符
while(Isnum(d))
{
num = 10*num + int(d-48);
d=del();
}
OPND.Push(num);
cout<<"/t/t/t进栈: "<<num<<endl;
c=d;
}
else
switch(Precede(OPTR.GetTop(),c))
{
case -1://栈顶元素优先级低
OPTR.Push(c);
cout<<"/t/t/t进栈: "<<c<<endl;
c=del();
break;
case 0://脱括号并接收下一字符
OPTR.Pop();
c=del();
break;
case 1://退栈并将运算结果入栈
char op;
int a ,b;
op=OPTR.Pop();
b=OPND.Pop();
a=OPND.Pop();
cout<<"/t/t/t/t出栈: "<<op<<endl;
cout<<"/t/t/t/t出栈: "<<a<<" , "<<b<<endl;
cout<<"/t/t/t/t计算: "<<a<<op<<b<<endl;
OPND.Push(Operate(a,op,b));
break;
case 2://输入错误的情况
cout<<"输入表达式错误!"<<endl;
exit(0);
break;
}//switch
}//while
cout<<"/t**************************************************************";
cout<<" /t/t/t/t/t/t最后的结果为: "<<OPND.GetTop();
}
//*******************************************************************************************************************
void main() //定义主函数
{
cout<<"请输入表达式:"<<endl;
cout<<"/t例子: (14*(9/3))-32= "<<endl;
cout<<"/t(可以包含任意数量前导空格)"<<endl;
cout<<"请输入表达式:"<<endl;
Cal() ;
cout<<endl;
system("pause");
}