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

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/10 08:33:34
用一个栈来存符号把数学的中缀表达式计算出来需要注释

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

用一个栈来存符号把数学的中缀表达式计算出来需要注释
#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));
加分

用一个栈来存符号把数学的中缀表达式计算出来需要注释 后缀表达式如何转成中缀表达式?是后转中!我知道后缀表达式如何计算出具体的数字,但是怎么把它转成中缀表达式呢?做填空题用,所以最好要能笔算的, 把中缀表达式转换为后缀表达式的算法我需要用html和javascript实现一个科学计算器的全部功能包括三角函数等常用函数,现在需要有把中缀表达式转换为后缀表达式的方法,希望有具体的解释, PASCAL 中 前缀表达式与中缀表达式间,以及后缀表达式与中缀表达式间如何实现转换?就是用程序求出 前缀表达式的值,中缀表达式的值以及后缀表达式的值 用C++实现布尔表达式的真值问题目的:本课程设计是求中缀算术表达式真值问题.求中缀算术表达式值的问题是数据结构中栈的一个典型应用.通过本题,学生应掌握中缀表达式和后缀表达式的 前缀、中缀、后缀表达式是怎样的? 数据结构,如何把一个后缀表达式换为中缀表达式,比如a+b*c+(d*e+f)*g ‘中缀表达式’‘和后缀表达式’的英文是什么? 利用栈把表达式的中缀表示转换成后缀表示C++利用栈把表达式的中缀表示转换成后缀表示(逆波兰)表达式的表示:中缀:a+b/c-d ==》 后缀:abc/+d- 中缀:a+b/c-d*(e+f*g) ==》后缀:abc/+defg* 用堆栈实现将中缀表达式转化为后缀表达式 前缀、中缀、后缀表达式是怎样的?如题 把中缀表达式转为后缀表达式有多少种方法?哪一种最好? f(4-x)的反函数用数学符号表达式是什么 中缀表达式A-(B+C/D)*E的后缀表达式是( ).最好有一棵树的图解.主要不清楚在二叉树中符号要放在那里?两个结点之间还是一个结点前面?给定一个正整数N=8934632178,现决定依次删除其中6个数位 2001 USACO 绿组 奶牛表达式 (要求用PASCAL语言编写)在数学中同一个表达式常有几种写法,其中中缀表式是最常见的,如1+2和7*(5-3).而在前缀表达式中,运算符式写操作数之前的,如上述的表达式的 表达式a*(b+C)-d的后缀表达式什么?什么叫中缀和后缀? 中缀表达式A-(B+C/D)*E的后缀表达式是什么 数据结构题,中缀表达式A-(B+C/D)*E的后缀表达式是?