编程基础之算术表达式与顺序执行((二)用顺序栈实现算术后缀表达式求值)

:暂无数据 2026-09-05 11:10:06 :0

编程基础之算术表达式与顺序执行((二)用顺序栈实现算术后缀表达式求值)

各位老铁们好,相信很多人对编程基础之算术表达式与顺序执行都不是特别的了解,因此呢,今天就来为大家分享下关于编程基础之算术表达式与顺序执行以及(二)用顺序栈实现算术后缀表达式求值的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

(二)用顺序栈实现算术后缀表达式求值

include 《malloc.h》
#include 《stdio.h》
#include 《ctype.h》//判断是否为字符的函数的头文件
#define maxsize 100
typedef int elemtype;
typedef struct sqstack sqstack;//由于sqstack不是一个类型 而struct sqstack才是
char ch=;//把符号转换成一个字符数组
int f1=;//栈内元素优先级
int f2=;//栈外的元素优先级
struct sqstack
{
elemtype stack;
int top;
};
void Initstack(sqstack *s)
{
s-》top=0;
}
void Push(sqstack *s,elemtype x)
{
if(s-》top==maxsize-1)
printf("Overflow\n");
else
{
s-》top++;
s-》stack=x;
}
}
void Pop(sqstack *s,elemtype *x)
{
if(s-》top==0)
printf("underflow\n");
else
{
*x=s-》stack;
s-》top--;
}
}
elemtype Gettop(sqstack s)
{
if(s.top==0)
{
printf("underflow\n");
return 0;
}
else
return s.stack;
}
elemtype f(char c)
{
switch(c)
{
case ’+’:
return 0;
case ’-’:
return 1;
case ’*’:
return 2;
case ’/’:
return 3;
case ’(’:
return 4;
case ’)’:
return 5;
default:
return 6;
}
}
char precede(char c1,char c2)
{
int i1=f(c1);
int i2=f(c2);//把字符变成数字
if(f1)//通过原来设定找到优先级
return ’》’;
else if(f1)
return ’《’;
else
return ’=’;
}
int Operate(elemtype a,elemtype theta,elemtype b)
{
int sum;
switch(theta)
{
case 0:
sum=a+b;
break;
case 1:
sum=a-b;
break;
case 2:
sum=a*b;
break;
default:
sum=a/b;
}
return sum;
}
EvaluateExpression()
{
char c;
int i=0,sum=0;
int k=1,j=1;//设置了开关变量
elemtype x,theta,a,b;
sqstack OPTR,OPND;
Initstack(&OPTR);
Push(&OPTR,f(’洞悔歼#’));//0压入栈
Initstack(&OPND);
c=getchar();
if(c==ch)//先对+和-的情况忽略和左括号的情况
{
printf("错误1 \n");
k=0;
return 0;
}
if(c==ch)
c=getchar();//如果是+,把它覆盖
if(c==ch)
{
j=0;
c=getchar();//也把-号覆盖
}
while(c!=’#’||ch!=’#’)
{
if(isdigit(c))
{
sum=0;
while(isdigit(c))
{
if(!j)
{
sum=sum*10-(c-’0’);//实现了数字串前面有负号(之前桐前是:sum=-(sum*10)-(c-’0’)结果是-12+13=21)
}
else
sum=sum*10+(c-’0’);
c=getchar();
}
Push(&OPND,sum);//如果还是数字先不压栈,把数字串转化成十进制数字再压栈
j=1;
}
else
if(k)
{
switch(precede(ch,c))
{
case’《’: Push(&OPTR,f(c));//把它们整型化
c=getchar();
if(c==ch||c==’纳冲\n’)//要除去下个是‘(’的情况 也把以运算符归到这里来
{
printf("出错2\n");
k=0;
return 0;//加了开关变量和返回0的值使程序更以操作
}
break;
case’=’: Pop(&OPTR,&x);
c=getchar();
if(c==ch的情况也忽略了但此时并没有注意到右括号后面右运算符的情况
{
printf("出错2\n");
k=0;
return 0;
}
break;
case’》’: Pop(&OPTR,θ);
Pop(&OPND,&b);
Pop(&OPND,&a);//注意这里是谁先出栈
Push(&OPND,Operate(a,theta,b));
break;
}
}
}//在这里判断是否以运算符结束是不对的
return(Gettop(OPND));
}
main()
{
int result;
printf("输入你的算术表达式:\n");
result=EvaluateExpression();
printf("结果是 :%d\n",result);
return 0;
}
:
本计算器利用堆栈来实现。
1、定义后缀式计算器的堆栈结构
因为需要存储的单元不多,这里使用顺序栈,即用一维数组来模拟堆栈:
#define MAX 100
int stack;
int top=0;
因此程序中定义了长度为MAX的一维数组,这里MAX用宏定义为常数100,我们可以修改宏定义而重新定义堆栈的大小。
整型数据top为栈顶指示,由于程序开始时堆栈中并无任何数据元素,因此top被初始化为0。
2、存储后缀式计算器的运算数
我们定义了堆栈stack后,就可以利用入栈操作存储先后输入的两个运算数。
下面看一下是如何实现的:
int push(int i) /*存储运算数,入栈操作*/
{
if(top《MAX)
{
stack=i; /*堆栈仍有空间,栈顶指示上移一个位置*/
return 0;
}
else /*堆栈已满,给出错误信息,返回出错指示*/
{
printf("The stack is full");
return ERR;
}
}
我们在调用函数push时,如果它的返回值为0,说明入栈操作成功;否则,若返回值为ERR(在程序中说明为-1),说明入栈操作失败。
3、从堆栈中取出运算数
当程序中读完了四则运算符后,我们就可以从堆栈中取出已经存入的两个运算数,构成表达式,计算出结果。取出运算数的函数采用的正是出栈算法。在本例中,实现该算法的函数 为pop():
int pop(); /*取出运算数,出栈操作*/
{
int var; /*定义待返回的栈顶元素*/
if(top!=NULL) /*堆栈中仍有数据元素*/
{
var=stack; /*堆栈指示下移一个位置*/
return var;
}
else /*堆栈为空,给出错误信息,并返回出错返回值*/
printf("The stack is cmpty!\n");
return ERR;
}
同样,如果堆栈不为空,pop()函数返回堆栈顶端的数据元素,否则,给出栈空提示,并返回错误返回值ERR。
4、设计完整的后缀式计算器
有了堆栈存储运算数,后缀式计算器的设计就很简单了。程序首先提示用户输入第一个运算数,调用push()函数存入堆栈中;而后提示用户输入第二个运算数,同样调用push()函数存入堆栈中。接下来,程序提示用户输入+,-,*,/四种运算符的一种,程序通过switch_case结构判断输入运算符的种类,转而执行不同的处理代码。以除法为例,说明程序的执行流程:
case ’/’:
b=pop();
a=pop();
c=a/b;
printf("\n\nThe result is %d\n",c);
printf("\n");
break;
程序判断用户输入的是除号后,就执行上述代码。首先接连两次调用pop()函数从堆栈中读出先前输入的运算数,存入整型数a和b中;然后执行除法运算,结果存入单元c中。这时需要考虑究竟谁是被除数,谁是除数。由于开始我们先将被除数入栈,根据堆栈“先进后出”的原则,被除数应该是第二次调用pop()函数得到的返回值。而除数则是第一次调用pop()函数得到的返回值。
最后程序打印出运算结果,并示提示用户是否继续运行程序:
printf("\t Continue?(y/n):");
l=getche();
if(l==’n’)
exit(0);
如果用户回答是"n",那么结束程序,否则继续循环。
完整的程序代码如下:
#include《stdio.h》
#include《conio.h》
#include《stdlib.h》
#define ERR -1
#define MAX 100 /*定义堆栈的大小*/
int stack; /*用一维数组定义堆栈*/
int top=0; /*定义堆栈指示*/
int push(int i) /*存储运算数,入栈操作*/
{
if(top《MAX)
{
stack=i; /*堆栈仍有空间,栈顶指示上移一个位置*/
return 0;
}
else
{
printf("The stack is full");
return ERR;
}
}
int pop() /*取出运算数,出栈操作*/
{
int var; /*定义待返回的栈顶元素*/
if(top!=NULL) /*堆栈中仍有元素*/
{
var=stack; /*堆栈指示下移一个位置*/
return var; /*返回栈顶元素*/
}
else
printf("The stack is empty!\n");
return ERR;
}
void main()
{
int m,n;
char l;
int a,b,c;
int k;
do{
printf("\tAriothmatic Operate simulator\n"); /*给出提示信息*/
printf("\n\tPlease input first number:"); /*输入第一个运算数*/
scanf("%d",&m);
push(m); /*第一个运算数入栈*/
printf("\n\tPlease input second number:"); /*输入第二个运算数*/
scanf("%d",&n);
push(n); /*第二个运算数入栈*/
printf("\n\tChoose operator(+/-/*//):");
l=getche(); /*输入运算符*/
switch(l) /*判断运算符,转而执行相应代码*/
{
case ’+’:
b=pop();
a=pop();
c=a+b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case ’-’:
b=pop();
a=pop();
c=a-b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case ’*’:
b=pop();
a=pop();
c=a*b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
case ’/’:
b=pop();
a=pop();
c=a/b;
printf("\n\n\tThe result is %d\n",c);
printf("\n");
break;
}
printf("\tContinue?(y/n):"); /*提示用户是否结束程序*/
l=getche();
if(l==’n’)
exit(0);
}while(1);
}
:
#include 《stdio.h》
#include 《conio.h》
#include 《malloc.h》
#include 《stdlib.h》
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#define STACK_INIT_SIZE 100 //初始分配量
#define STACKINCREMENT 10 //存储空间的分配增量
typedef char ElemType;
typedef ElemType OperandType; //操作数
typedef char OperatorType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S)
{
//构造一个空栈S
S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S.base) exit (OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status GetTop(SqStack S){
ElemType e;
if (S.top == S.base) return ERROR;
e = *(S.top-1);
return e;
}
Status Push (SqStack &S,ElemType e)
{
//插入元素e为新的栈顶元素
if (S.top - S.base 》= S.stacksize){
S.base = (ElemType *) realloc ( S.base,
(S.stacksize + STACKINCREMENT) * sizeof(ElemType));
if(!S.base) exit (OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
Status Pop (SqStack &S,ElemType &e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top == S.base) return ERROR;
e = * --S.top;
return OK;
}
char In(char c,char OP)
{
if(c》=35 && c《=47)
return 1;
else return 0;
}
char OP=;
int m={1,1,2,2,2,1,1,
1,1,2,2,2,1,1,
1,1,1,1,2,1,1,
1,1,1,1,2,1,1,
2,2,2,2,2,0,-1,
1,1,1,1,-1,1,1,
2,2,2,2,2,-1,0};//1 》 2 《 0 = -1 不存在
char Precede(char i,char j)
{
int a,b; char *p;
for(p=OP,a=0;*p!=’\0’;p++,a++)
if(*p==i) break;
for(p=OP,b=0;*p!=’\0’;p++,b++)
if(*p==j) break;
if(m==1) return ’》’;
else if(m==2) return ’《’;
else if(m==0) return ’=’;
else return ’O’;
}
char Operate(char a,char theta,char b)
{
if(a》47) a=atoi(&a);
if(b》47) b=atoi(&b);
switch(theta)
{
case ’+’: return a+b;
break;
case ’-’: return a-b;
break;
case ’*’: return a*b;
break;
case ’/’: return a/b;
break;
}
}
OperandType EvaluateExpression()
{
SqStack OPTR,OPND;
OperandType a,b,c; OperatorType theta;
InitStack(OPTR); Push(OPTR,’#’);
InitStack(OPND); c=getchar();
while (c!=’#’ || GetTop(OPTR)!=’#’)
{
if (!In(c,OP))
else
switch(Precede(GetTop(OPTR),c))
{
case ’《’ :
Push(OPTR,c); c = getchar();
break;
case ’=’ :
Pop(OPTR,c); c = getchar();
break;
case ’》’ :
Pop(OPTR,theta);
Pop(OPND,b); Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}
}
return GetTop(OPND);
}
void main()
{
printf("(以#为结束符)\n");
printf("请输入:\n");
int a;
a=(int)EvaluateExpression();
printf("%d",a);
getch();
}
:
ls都正确
:
C++ In Action这本书里面有表达式求值的详细项目分析.
:
数据结构的书里面都有的,仔细看一下
:
studyall123的只能对0到9的数字运算才有效,对于10以上的数字就不行!不知道有没有更好的方法!
:
现在的人,连google一下都懒啊
:
实际上是按照逆波兰式的顺序让输入的表达式入栈,再根据运算符优先级来计算。
:
lenrning!

算术表达式的方式

C语言中的算术表达式
算术表达式是由常量、变量、函数、圆括号、运算符等组成。一个常量、一个变量(已赋过值)、一个函数都歼卖是合法的表达式,是表达式的简单情况。例如:
5.0 + sqrt(4.0)
其中sqrt是函数,功能是求参数的平方根,sqrt(4.0)的值是2.0。
一般情衫升况,算术表达式可包含更多的运算数据、运算符、圆括号,例如:
(a-b)/c*2+’a’+15%-4
C语言表达式中的所有成分都是写在一行上,没有分式,也没有上下标,括号只能用圆括号(和{}在C语言中作其它用)。如数学表达式:
a+b
——
a-b
需写成(a+b)/(a-b)或改老,其中括号不能省,如写成a+b/a-b就不能表示该表达式了。
表达式的运算过程和数学中的规则一样,有括号先做括号内的子表达式。有多层括号,先运算最里层。同一层,负号优先运算,再接下来运算乘除,再加减;同一优先级从左到右进行运算……
Java算术表达式
在程序中,表达式是用于计算求值的基本单位,可以简单地将表达式理解为计算的公式。它是由运算符(如“+“、”-“、”*“、”/“)、运算量和括号组成的式子。符合语法规则的表达式可以被编译系统理解、执行或计算、表达式的值就是对它运算后所得的结果。
其他高级计算机语言算术表达式
与c语言基本雷同。

C语言中表达式1 | | (表达式2) &&表达式3 为什么先执行表达式1

按照C语言优先级, A || B && C相当于A || (B && C), 所以你可能默认了先执行B && C.
但是需要注意C语言的标准采用逻辑表达式短路求值: 对于d=X||Y, 如果X成立则不执行Y而直接得到d=1; 对于d=X&&Y若X不成立同样跳过Y直接得到d=0.
在则祥闹你的例子里 A || (B && C) 先得孙罩到了A成立, 所以就跳过了余下的表宴族达式.

如何使用数学式编程

1、算术表达式:
算术表达式是最常用的表达式,又称为数值表达式。它是通过算术运算符来进行运算的数学公式。我们先来看Visual Basic中的算术运算符:
算术运算符
1)乘法运算符 *
X*Y 求X乘Y的值 举例:6*7=42
2) 除法运算符 /
X/Y 求X除Y的值(浮点数运算穗简) 举例:2.76/1.2=2.3
3)整除运算符 div
X div Y 求X除Y的整数商(对整型数计算) 举例:25=5
4)取余运算符 Mod
X mod Y 求X除Y的余数(对整型数运算) 举例:25 mod 4=1
5)加法运算符 +
X+Y 加法运算 举例:32+2=34
6)减法烂族卜运算符 -
- X-Y 减法运算 举饥穗例:48-21=27
由于Visual Basic只能识别按其格式书写的数学表达式,所以必须将我们常用的数学表达式转换成Visual Basic表达式。
2、逻辑表达式
逻辑运算的结果只有两个:True(真)和False(假)。Visual Basic提供了六种关系运算符和三种逻辑运算符:
=(等于)、《(小于)、《=(小于等于)、》(大于)、》=(大于等于)、《》(不等于)
NOT(非)、AND(与)、OR(或)
运算关系
p q NOT p p AND q p OR q
True True False True True
True False False False True
False True True False True
False false True False False
例如:5》3 结果为 True, “a”》”b” 结果为False。

怎么记忆c语言中算术表达式中的运算先后顺序

这个要用到栈的李颂后进先出的特性,需要依次判断运算符的优先级,优先级低的依次入栈,遇到优先级高的就把计算结果入栈,哪亏郑最后依次计算并空察出栈,具体代码不是一两行就能说清楚的。

以上就是我们为大家找到的有关“编程基础之算术表达式与顺序执行((二)用顺序栈实现算术后缀表达式求值)”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。

编程基础之算术表达式与顺序执行((二)用顺序栈实现算术后缀表达式求值)

本文编辑:admin

更多文章:


怎么做网站网页归档(网页应该怎么做网页设计有哪些要求)

怎么做网站网页归档(网页应该怎么做网页设计有哪些要求)

大家好,怎么做网站网页归档相信很多的网友都不是很明白,包括网页应该怎么做网页设计有哪些要求也是一样,不过没有关系,接下来就来为大家分享关于怎么做网站网页归档和网页应该怎么做网页设计有哪些要求的一些知识点,大家可以关注收藏,免得下次来找不到哦

2026年10月11日 05:30

跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意

跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意

本篇文章给大家谈谈二郎腿贴地,以及跷二郎腿太低好吗对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月11日 05:10

易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)

易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)

本篇文章给大家谈谈易语言点击js按钮,以及易语言网页填表怎样点击链接为“javascript:void(0)“的按钮对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要

2026年10月11日 03:00

regards(Regards,什么意思)

regards(Regards,什么意思)

其实regards的问题并不复杂,但是又很多的朋友都不太了解Regards,什么意思,因此呢,今天小编就来为大家分享regards的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 01:10

dom4j文档(如何去掉用dom4j生成的XML文档中的)

dom4j文档(如何去掉用dom4j生成的XML文档中的)

其实dom4j文档的问题并不复杂,但是又很多的朋友都不太了解如何去掉用dom4j生成的XML文档中的,因此呢,今天小编就来为大家分享dom4j文档的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月11日 01:00

compare with造句(用compared with和compared to造句)

compare with造句(用compared with和compared to造句)

“compare with造句”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看compare with造句(用compared with和compared to造句)!

2026年10月10日 23:30

xshell软件(Xshell怎么更改字体大小)

xshell软件(Xshell怎么更改字体大小)

各位老铁们好,相信很多人对xshell软件都不是特别的了解,因此呢,今天就来为大家分享下关于xshell软件以及Xshell怎么更改字体大小的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月10日 22:50

tensorflow与keras对应版本(为什么tensorflow2.8没有keras)

tensorflow与keras对应版本(为什么tensorflow2.8没有keras)

各位老铁们好,相信很多人对tensorflow与keras对应版本都不是特别的了解,因此呢,今天就来为大家分享下关于tensorflow与keras对应版本以及为什么tensorflow2.8没有keras的问题知识,还望可以帮助大家,解决

2026年10月10日 22:10

个人网站首页界面(深圳社会保险服务个人网页主页)

个人网站首页界面(深圳社会保险服务个人网页主页)

“个人网站首页界面”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看个人网站首页界面(深圳社会保险服务个人网页主页)!

2026年10月10日 22:00

maven仓库jar网站(如何在maven仓库中添加jar包)

maven仓库jar网站(如何在maven仓库中添加jar包)

这篇文章给大家聊聊关于maven仓库jar网站,以及如何在maven仓库中添加jar包对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月10日 19:50

最近更新

oppo r813t卡刷包(oppo r813s可以刷r813t刷机包)
2026-10-11 10:00:25 浏览:0
热门文章

by网站域名444(444ppp现在是什么域名)
2026-08-19 20:20:31 浏览:13
韩国大片视频mv(韩国20个感人mv)
2026-07-11 13:10:02 浏览:12
标签列表