数据结构——表达式求值

#include <iostream>
using namespace std;

#define StackSize 100
typedef
struct
{
char data[StackSize];
int top;
}SeqStack1;
//操作符栈
typedef struct
{
int data[StackSize];
int top;
}SeqStack2;
//数据栈

char a[]={'+' , '-' , '*' , '/' , '(' , ')' , '#' };
char PriorityTable[7][7]={ { '>', '>', '<', '<', '<', '>', '>'},
{
'>', '>', '<', '<', '<', '>', '>'},
{
'>', '>', '>', '>', '<', '>', '>'},
{
'>', '>', '>', '>', '<', '>', '>'},
{
'<', '<', '<', '<', '<', '=', 'N'},
{
'>', '>', '>', '>', 'N', '>', '>'},
{
'<', '<', '<', '<', '<', 'N', '='} };

//初始化顺序栈
void init(SeqStack1 *s1)
{
s1
->top=0;
}
void init(SeqStack2 *s2)
{
s2
->top=0;
}

//压入到操作符栈
void Push(SeqStack1 *s1,char x)
{
++s1->top;
s1
->data[s1->top]=x;
}
//压入到数据栈
void Push(SeqStack2 *s2,int x)
{
++s2->top;
s2
->data[s2->top]=x;
}

//操作符栈顶元素弹出进行运算
char Pop(SeqStack1 *s1)
{
return s1->data[s1->top--];
}
//弹出数据栈顶元素去进行运算
int Pop(SeqStack2 *s2)
{
return s2->data[s2->top--];
}

//取操作栈顶的运算符和新读到的运算符比较优先顺序
char gettop(SeqStack1 *s1)
{
return s1->data[s1->top];
}
//取数据栈顶元素
int gettop(SeqStack2 *s2)
{
return s2->data[s2->top];
}

//比较操作符优先顺序
char compare(char ch1,char ch2)
{
int i,j;
for(i=0;i<7;i++)
if(a[i]==ch1)
break;
for(j=0;j<7;j++)
if(a[j]==ch2)
break;
return PriorityTable[i][j];
}

//执行操作符运算
int Operate(int a,char theta, int b)
{
if(theta=='+')
return a+b;
else if(theta=='-')
return a-b;
else if(theta=='*')
return a*b;
else
return a/b;
}

//显示操作符栈
void display_seqstack(SeqStack1 *s1)
{
if(s1->top==0)
cout
<<"is empty!";
else
{
int temp=s1->top;
while(temp!=0)
cout
<<s1->data[temp--]<<" ";
}
}
//显示数据栈
void display_seqstack(SeqStack2 *s2)
{
int temp=s2->top;
while(temp!=0)
cout
<<s2->data[temp--]<<" ";
}
//输入表达式
void inputExpress(char *express)
{
int length=0;
printf(
"请输入一个表达式:");
scanf(
"%s",express);
int len =strlen(express);
express[len]
='#';//表达式最后一位默认为'#';
express[len+1]='\0';
}

int main()
{
SeqStack2
*OPND;
OPND
=(SeqStack2 *) malloc(sizeof(SeqStack2));
//初始化操作数栈
init(OPND);

SeqStack1
*OPTR;
OPTR
=(SeqStack1 *) malloc(sizeof(SeqStack1));
//初始化操作数栈
init(OPTR);
Push(OPTR,
'#');


//输入表达式
char express[100];
inputExpress(express);
//输入表达式
int i=0 ;
while(express[i]!='#' || gettop(OPTR)!='#' )
{
if(express[i]>='0' && express[i]<='9') //不是运算符则进操作数栈
{
int num=express[i]-48;
for(int j=i+1;express[j]!='\0';j++) //******当数大于10时的处理******
{
if(express[j]>='0' && express[j]<='9')
num
=num*10+(express[j]-48);
else
break;
}
Push(OPND,num);
i
=j; //i跳到j这
}
else
switch(compare(gettop(OPTR),express[i]))
{
case '<': //栈顶元素优先权低
Push(OPTR,express[i]);
i
++;
break;
case '=': //脱括号并接受下一字符
Pop(OPTR);
i
++;
break;
case '>': //退出并将运算结果入栈
char theta=Pop(OPTR);
int b=Pop(OPND);
int a=Pop(OPND);
int result=Operate(a,theta,b); //退出栈的数据运算后再入栈
Push(OPND,result);
break;
}
//switch
display_seqstack(OPTR);
cout
<<" ";
display_seqstack(OPND);
cout
<<endl;

}
//while
cout<<endl<<gettop(OPND)<<endl;
return 0;
}

 

posted @ 2010-07-26 15:46  忧国忧铭  Views(1353)  Comments(0)    收藏  举报