后缀表达式的计算规则:先列出操作数,后给操作符,遇到操作符立刻对已有的操作数进行计算,计算结果当作一个操作数继续参与下面的计算。以2 1 + 3 *为例:从左向右读,首先是一个数2,入栈;又是一个数1,入栈;下面是一个操作符+,从栈中弹出两个操作数1和2,做加法得3,3入栈;又一个数3,入栈;下面是操作符*,从栈中弹出两个操作数3和3,做乘法得9,压栈。这时表达式处理完,从栈中弹出一个数是9,这就是结果;如果栈中还有数,说明表达式错误。
对于一元函数只需取一个操作数就够了。
主要的数据结构就是栈。
#include
#include
#include
#include
#include
#define LEN sizeof(Stack)
#define MaxSize 100
using namespace std;
struct stu
{
float data[MaxSize];
int top;
}*st;
struct
{
char ch;
int pri;
}lpri[]={ {'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6} },
rpri[]={ {'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1} };
char postexp[MaxSize];//后缀表达式
int index=0;//用来启示录POSTEXP原素位置
char ex[MaxSize];//表达式
int count;//计算位数
typedef struct stack
{
char ch[MaxSize];
int top;
}Stack;
void InitStack(Stack *&s)
{
s=(Stack*)malloc(LEN);
s->top=-1;
}
void Free(Stack *&s)
{
free(s);
}
int change_into_dig(int i,int l,char e[])
{
int j,power=0;
int s=0;
count=1;
for(j=i+1;j
count++;
j--;//整数的个位
while(j>=i)
{
s=s+(e[j]-48)*pow(10,power);
j--;
power++;
}
return s;
}
void PushStack(Stack *&s,int elem)
{
if(s->top==MaxSize-1)
cout<<"full"<
{
s->top++;
s->ch[s->top]=elem;
}
}
int compare(char ex,char op)
{
int pri_ex,pri_op;
for(int i=0;i<7;i++)
{
if(ex==rpri[i].ch)
pri_ex=rpri[i].pri;
if(op==lpri[i].ch)
pri_op=lpri[i].pri;
}
if(pri_ex>pri_op)
return 1;
else if(pri_ex==pri_op)
return 0;
else
return -1;
}
void Pop(Stack *&s)
{
if(s->top==-1)
cout<<"empty"<
s->top--;
}
void tran(Stack *&op)
{
int l,i,k,s,value;
l=strlen(ex);
for(i=0;i
if(ex[i]>=48 && ex[i]<=57)//数字
{
count=0;
for(int j=i;ex[j]>=48 && ex[j]<=57 && j
postexp[index]=ex[j];
index++;
count++;
}
i=i+count-1;
postexp[index++]='#';
}
else if(ex[i]=='s'||ex[i]=='c'||ex[i]=='t')
{
count=0;
postexp[index++]=ex[i];
for(k=i+3;ex[k]>=48&&ex[k]<=57&&k
postexp[index++]=ex[k];
count++;
}
i=i+count-1+3;
postexp[index++]='#';
}
else
{
switch(compare(ex[i],op->ch[op->top]))
{
case 1:
PushStack(op,ex[i]);
break;
case 0:
Pop(op);
break;
case -1:
postexp[index++]=op->ch[op->top];
op->top--;
i--;
}
}
}
while(op->ch[op->top]!='=')
postexp[index++]=op->ch[op->top--];
postexp[index]='\0';
}
float compvalue()
{
st=(struct stu*)malloc(sizeof(struct stu) );
st->top=-1;
int value;
int i,l;
l=strlen(postexp);
for(i=0;i
if(postexp[i]>=48&&postexp[i]<=57)
{
value=change_into_dig(i,l,postexp);
st->top++;
st->data[st->top]=value;
i=i+count;
}
else if(postexp[i]=='s'||postexp[i]=='c'||postexp[i]=='t')
{
value=change_into_dig(i+1,strlen(postexp),postexp);
cout<
switch(ex[i])
{
case 's':
tri_value=sin(value);break;
case 'c':
tri_value=cos(value);break;
case 't':
tri_value=tan(value);break;
}
cout<
st->data[st->top]=tri_value;
i=i+count+1;
}
else
{
char c=postexp[i];
int v1=st->data[st->top--],v2=st->data[st->top--],v;
switch(c)
{
case '+':
v=v1+v2;
st->data[++st->top]=v;
break;
case '-':
v=v2-v1;
st->data[++st->top]=v;
break;
case '*':
v=v1*v2;
st->data[++st->top]=v;
break;
case '/':
if(v1==0)
{
cout<<"v1 can't be zero"<
}
v=v2/v1;
st->data[++st->top]=v;
break;
}
}
}
return st->data[st->top];
}
int main()
{
Stack *op;
InitStack(op);
op->top++;
op->ch[0]='=';
cin>>ex;
tran(op);
cout<
cout<<"表达式的值为"<
}
/*
(56-20)/(4+2)
*/