一、实验目的
1.深入了解栈的特点,以便在实际问题背景下灵活运用栈。
2.巩固对栈的构造方法的理解。
3.熟练掌握栈基本操作的C语言实现。
4.掌握递归算法的设计,了解栈在函数递归调用中所起的作用。
5.了解栈在实际问题中的应用,具备利用栈解决实际问题的能力。
二、实验题目
1.设计并验证以下算法:首先将一个中缀表达式转换成逆波兰式,然后对此逆波兰式求值。
注:逆波兰式又称后缀表达式(将运算符写在操作数之后)。
三、程序清单
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MaxSize 1000
struct StackNum{
char data[MaxSize];
int top=0;
};
struct StackChar{
int data[MaxSize];
int top=0;
};
StackNum num;
StackChar str;
char h1[1000];
int cnt=0;
void PushNum(StackNum& s,int x){
if(s.top<MaxSize){
s.data[++s.top]=x;
}
else{
printf("栈满!");
}
}
void PushChar(StackChar& s,char x){
if(s.top<MaxSize){
s.data[++s.top]=x;
}
else{
printf("栈满!");
}
}
void PopNum(StackNum& s){
if(s.top>0){
--s.top;
}
else{
printf("栈空!");
}
}
void PopChar(StackChar& s){
if(s.top>0){
--s.top;
}
else{
printf("栈空!");
}
}
void eval(){
int a=num.data[num.top];
PopNum(num);
int b=num.data[num.top];
PopNum(num);
char c=str.data[str.top];
PopChar(str);
if(c=='+'){
PushNum(num,b+a);
}
if(c=='-'){
PushNum(num,b-a);
}
if(c=='*'){
PushNum(num,b*a);
}
if(c=='/'){
PushNum(num,b/a);
}
h1[++cnt]=c;
h1[++cnt]=' ';
}
char eql(char a,char b){
int x,y;
char st[] = { '+','-','*','/', '(', ')'};
for(int i=0;i<6;i++)
if(a==st[i])
x=i;
for(int i=0;i<6;i++)
if(b==st[i])
y=i;
char m[6][6] = {
{'>','>','<','<','<','>'},
{'>','>','<','<','<','>'},
{'>','>','>','>','<','>'},
{'>','>','>','>','<','>'},
{'<','<','<','<','<','='},
{'>','>','>','>',' ','>'}
};
return m[x][y];
}
int main(){
char s[1000];
scanf("%s",s);
for(int i=0;i<strlen(s);i++){
if(isdigit(s[i])){
int x=0,j=i;
while(isdigit(s[j])&&j<strlen(s)){ //判断多位数
h1[++cnt]=s[j];
x=x*10+s[j]-'0';
j++;
}
h1[++cnt]=' ';
PushNum(num,x);
i=j-1;
}
else{
while((str.top!=0)&&(eql(str.data[str.top],s[i])=='>'))
eval();
if(str.top==0)
PushChar(str,s[i]);
if(eql(str.data[str.top],s[i])=='=')
PopChar(str);
if(eql(str.data[str.top],s[i])=='<')
PushChar(str,s[i]);
}
}
while(str.top!=0)
eval();
printf("后缀表达式为:");
for(int i=1;i<=cnt;i++)
printf("%c",h1[i]);
printf("\n");
printf("结果为:%d",num.data[num.top]);
return 0;
}
四、实验结果