template<class T>class Stack
{
T data[MAX_SIZE];
int top;
public:
Stack(void);
~Stack(void);
bool empty(void);
void push(T a);
T pop(void);
T GetTop(void);
};
template <class T>Stack<T>::Stack(void)//构造函数
{
top=-1;
}
template <class T>Stack<T>::~Stack(void)//析构函数
{
}
template <class T>bool Stack<T>::empty(void)//判断栈空操作
{
return top==-1?true :false;
}
template <class T>void Stack<T>::push(T a)//入栈操作
{
if(top==MAX_SIZE)
{
cout<<"Stack is full!"<<endl;
return;
}
data[++top]=a;
}
template <class T>T Stack<T>::pop(void)//出栈操作
{
if(top==-1)
{
cout<<"Stack is underflow!"<<endl;
return 0;
}
return data[top--];
}
template <class T>T Stack<T>::GetTop(void)//取栈头元素操作
{
if(top!=-1)
return data[top];
else return false;
}
//计算表达式求值过程演示
#include<iostream.h>
#include<stdio.h>
#include<math.h>
#include"tstack.h"
float Operate(float a,char theta,float b)
{
float s;
switch(theta)
{
case'+': s=a+b;break;
case'-': s=a-b;break;
case'*': s=a*b;break;
case'/': s=a/b;break;
}
return s;
}
char Precede(char a,char b)
{
char array[7][7]={'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=','0','>','>','>','>','0','>','>','<','<','<','<','<','0','='};
int i,j;
switch(a)
{
case'+': i=0;break;
case'-': i=1;break;
case'*': i=2;break;
case'/': i=3;break;
case'(': i=4;break;
case')': i=5;break;
case'#': i=6;break;
}
switch(b)
{
case'+': j=0;break;
case'-': j=1;break;
case'*': j=2;break;
case'/': j=3;break;
case'(': j=4;break;
case')': j=5;break;
case'#': j=6;break;
}
return(array[i][j]);
}
void main()
{
char array[100],x,theta;
char *p,*q,A='y';
float s;
int i;
float v=0.0,a=0.0,b=0.0;
cout<<'\t'<<'\t'<<"****************************************"<<endl;
cout<<'\t'<<'\t'<<" 算术表达式求值 "<<endl;
cout<<'\t'<<'\t'<<"****************************************"<<endl;
cout<<'\t'<<'\t'<<" ------------中国科技大学-------------- "<<endl;
cout<<'\t'<<'\t'<<"|作者: 老大的小猪 |"<<endl;
cout<<'\t'<<'\t'<<"|______________________________________|"<<endl;
while(A=='y')
{
cout<<"请输入表达式(以#号键结束):"<<endl;
p=array;
cin>>array;
Stack<char>OPTR;
Stack<float>OPND;
OPTR.push('#');
while((*p)!='#'||OPTR.GetTop()!='#')
{
if((*p)>='0'&&(*p)<='9')
{
v=0.0;
q=p;
i=-1;
while((*q)>='0'&&(*q)<='9'&&(*q)!='.')
{
i++;
q++;
}
for(;i>=0;i--)
{
s=pow(10,i);
v+=((*p)-'0')*s;
p++;
}
if((*p)=='.')
{
p++;
while((*p)>='0'&&(*p)<='9')
{
s=pow(10,i);
v+=((*p)-'0')*s;
i--;
p++;
}
}
OPND.push(v);
}
else
switch(Precede(OPTR.GetTop(),(*p)))
{
case '<':OPTR.push((*p));
p++;break;
case '=':x=OPTR.pop();
p++;break;
case '>':theta=OPTR.pop();
b=OPND.pop();
a=OPND.pop();
OPND.push(Operate(a,theta,b));
break;
}
}
printf("%f\n",OPND.GetTop());
cout<<"想继续吗(y/n)?";
cin>>A;
}
}