作业帮 > 综合 > 作业

用一个栈来存符号把数学的中缀表达式计算出来

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/07/12 21:33:36
用一个栈来存符号把数学的中缀表达式计算出来
需要注释
用一个栈来存符号把数学的中缀表达式计算出来
#include
#include
#include
#define MAX 100
typedef struct
{
\x05int data[MAX];
int top;
}SeqStack;
SeqStack *Init_SeqStack() //初始化堆栈
{
SeqStack *s;
s=new SeqStack; //申请栈空间
if (!s)
{
\x05 printf("空间不足,初始化失败!");
return NULL; //未申请到足够大的存储空间,返回空指针
}
else
{
\x05 s->top=-1; //初始化栈顶指针
printf("堆栈初始化成功!\n按回车键继续...");
return s; //申请到栈空间,返回栈空间地址
}
}
int Empty(SeqStack *s){ //判空栈
if (s->top==-1)
return 1; //栈顶指针指向栈底,空栈
else
return 0;
}
int Push(SeqStack *s,int x){ //进栈
if (s->top==MAX-1)
return 0; //栈满不能入栈,返回错误代码0
else
{ s->top++; //栈顶指针向上移动
s->data[s->top]=x; //将x至入新的栈顶
return 1; //入栈成功,返回成功代码1
}
}
int Pop(SeqStack *s,int *x){ //出栈
if (Empty(s))
return 0; //栈空不能出栈,返回错误代码0
else
{ *x=s->data[s->top]; //保存栈顶元素值
s->top--; //栈顶指针向下移动
return 1; //返回成功代码1
}
}
int GetTop(SeqStack *s) //取栈顶元素
{
return(s->data[s->top]);
}
int Is_OPND(char x)//判断运算符和运算数
{
\x05int temp;
\x05temp=1;
\x05switch (x)
\x05{
\x05\x05case '^':
\x05\x05case '*':
\x05\x05case '/':
\x05\x05case '%':
\x05\x05case '+':
\x05\x05case '-':
\x05\x05case '(':
\x05\x05case ')':
\x05\x05case '#':temp=0;
\x05}
\x05return(temp);
}
int Precede(char in,char out)
{
\x05int c_temp1,c_temp2;
\x05int temp;
\x05switch(in)
\x05{
\x05\x05case '^':c_temp1=5;break;
\x05\x05case '*':
\x05\x05case '/':
\x05\x05case '%':c_temp1=4;break;
\x05\x05case '+':
\x05\x05case '-':c_temp1=2;break;
\x05\x05case '(':c_temp1=0;break;
\x05\x05case ')':c_temp1=6;break;
\x05\x05case '#':c_temp1=-1;
\x05}
\x05switch(out)
\x05{
\x05\x05case '^':c_temp2=5;break;
\x05\x05case '*':
\x05\x05case '/':
\x05\x05case '%':c_temp2=3;break;
\x05\x05case '+':
\x05\x05case '-':c_temp2=1;break;
\x05\x05case '(':c_temp2=6;break;
\x05\x05case ')':c_temp2=0;break;
\x05\x05case '#':c_temp2=-1;
\x05}
\x05if (c_temp1c_temp2) temp=1;//栈内算符优先级高,运算
\x05return(temp);
}
int Execute(int a,char op,int b){
\x05int s;
\x05switch(op){
\x05\x05case '^':s=(int)pow(a,b);break;
\x05\x05case '*':s=a*b;break;
\x05\x05case '/':s=a/b;break;
\x05\x05case '%':s=a%b;break;
\x05\x05case '+':s=a+b;break;
\x05\x05case '-':s=a-b;break;
\x05}
\x05return(s);
}
void main()
{
\x05SeqStack *OPTR,*OPND;//定义两个栈
\x05int w,op,temp;
\x05int a,b,is_err;
\x05OPTR=Init_SeqStack(); //初始化运算符optr堆栈
\x05OPND=Init_SeqStack(); //初始化运算数opnd堆栈
\x05is_err=Push(OPTR,'#'); //首先将#进运算符栈
\x05system("cls");
\x05printf("------------------中缀表达式求值程序------------------\n\n");
\x05printf("-----使用方法:连续输入表达式,以#号结束,最后按回车键.\n\n");
\x05printf("-----可使用的运算符包括:(、)、^、*、/、%、+、-\n\n");
\x05printf("-----注意:运算数为0-9十个数字.\n\n");
\x05printf("-----请输入表达式:");
\x05w=getchar();
\x05while(w!='#'||GetTop(OPTR)!='#')//算符栈顶元素不是#(表达式非0,执行语句)
\x05{
\x05\x05if (Is_OPND(w))//w为数值,返回1,w为算符,返回0
\x05\x05{
\x05\x05\x05Push(OPND,w-'0');//数值进opnd堆栈
\x05\x05\x05w=getchar();//循环
\x05\x05}
\x05\x05else
\x05\x05\x05switch(Precede(GetTop(OPTR),w))//否则,比较optr堆栈中栈顶的算符与getchar()函数读入的算符的优先级
\x05\x05\x05{
\x05\x05\x05\x05case -1://栈外算符优先级高,继续入栈
\x05\x05\x05\x05\x05\x05is_err=Push(OPTR,w);//入栈操作
\x05\x05\x05\x05\x05\x05w=getchar();//循环
\x05\x05\x05\x05\x05\x05break;
\x05\x05\x05\x05case 0://?
\x05\x05\x05\x05\x05\x05is_err=Pop(OPTR,&temp);
\x05\x05\x05\x05\x05\x05w=getchar();
\x05\x05\x05\x05\x05\x05break;
\x05\x05\x05\x05case 1://栈内算符优先级高
\x05\x05\x05\x05\x05\x05is_err=Pop(OPND,&b);//将栈顶的元素赋予后一个变量
\x05\x05\x05\x05\x05\x05is_err=Pop(OPND,&a);
\x05\x05\x05\x05\x05\x05is_err=Pop(OPTR,&op);
\x05\x05\x05\x05\x05\x05is_err=Push(OPND,Execute(a,op,b));
\x05\x05\x05\x05\x05\x05break;
\x05\x05\x05}
\x05}
\x05printf("-----结果为:%d\n",GetTop(OPND));
加分