问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构:利用栈来实现算术表达式求值的算法。91

发布网友 发布时间:2023-11-21 17:41

我来回答

2个回答

热心网友 时间:2024-12-03 18:23

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define error 0
#define ok 1
#define overflow -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OPSETSIZE 7
char OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};
unsigned char Prior[7][7] = { // 算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='
};
typedef int Status;

template <typename T>
struct SqStack
{
T *top;
T *base;
int stacksize;

};//顺序栈结构模板

template <typename T1,typename T2>
Status InitStack(T1 &S)
{
S.base=(T2 *)malloc(STACK_INIT_SIZE*sizeof(T2));
if(!S.base) exit (overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return ok;
}//初始化栈函数模板

template <typename T1,typename T2>
Status Push(T1 &S,T2 e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(T2 *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));
if(!S.base) exit (overflow);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return ok;
}//入栈函数模板

template <typename T1,typename T2>
Status Pop(T1 &S,T2 &e)
{
if(S.top==S.base) return error;
e=*--S.top;
return ok;
}//出栈函数模板

template <typename T1,typename T2>
T2 GetTop(T1 S)
{
if(S.top==S.base)
return error;
else
return *(S.top-1);

}//获取栈顶元素模板

Status In(char Test,char* TestOp) {
bool Find=false;
for (int i=0; i< OPSETSIZE; i++) {
if (Test == TestOp[i]) Find= true;
}
return Find;
}//判断是否为运算符

float Operate(float a,unsigned char theta, float b) {
switch(theta) {
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
default : return 0;
}
}//运算

int ReturnOpOrd(char op,char* TestOp) {
int i;
for(i=0; i< OPSETSIZE; i++) {
if (op == TestOp[i]) return i;
}
return 0;
}

char precede(char Aop, char Bop) {
return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}//ReturnOpOrd和precede组合,判断运算符优先级

float EvaluateExpression() {
// 算术表达式求值的算符优先算法。
// 设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。
SqStack<char> OPTR; // 运算符栈,字符元素
SqStack<float> OPND; // 运算数栈,实数元素
char TempData[20];
float Data,a,b;
char theta,c,x,Dr[2];

InitStack<SqStack<char>,char> (OPTR);
Push (OPTR, '#');
InitStack <SqStack<float>,float>(OPND);
strcpy(TempData,"\0");//将TempData置为空
c=getchar();
while (c!= '#' || GetTop<SqStack<char>,char>(OPTR)!= '#')
{
if (!In(c, OPSET))
{
Dr[0]=c;
Dr[1]='\0';//存放单个数
strcat(TempData,Dr);//将单个数连到TempData中,形成字符串
c=getchar();
if(In(c,OPSET))//如果遇到运算符,则将字符串TempData转换成实数,入栈,
并重新置空
{
Data=(float)atof(TempData);
Push(OPND, Data);
strcpy(TempData,"\0");
}
}
else
{ // 不是运算符则进栈
switch (precede(GetTop<SqStack<char>,char>(OPTR), c)) {
case '<': // 栈顶元素优先权低
Push(OPTR, c);
c=getchar();
break;
case '=': // 脱括号并接收下一字符
Pop(OPTR, x);
c=getchar();
break;
case '>': // 退栈并将运算结果入栈
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
Push(OPND, Operate(a, theta, b));
break;
} // switch
}
} // while
return GetTop<SqStack<float>,float>(OPND);
} // EvaluateExpression

void main()
{
printf("请输入表达式(end #):\n");
printf("%f\n",EvaluateExpression());
}

给你一个完全的程序,本人自己写的。

热心网友 时间:2024-12-03 18:24

#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define
error
0
#define
ok
1
#define
overflow
-1
#define
STACK_INIT_SIZE
100
#define
STACKINCREMENT
10
#define
OPSETSIZE
7
char
OPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};
unsigned
char
Prior[7][7]
=
{
//
算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','
',
'>','>','>','>','
','>','>',
'<','<','<','<','<','
','='
};
typedef
int
Status;
template
<typename
T>
struct
SqStack
{
T
*top;
T
*base;
int
stacksize;
};//顺序栈结构模板
template
<typename
T1,typename
T2>
Status
InitStack(T1
&S)
{
S.base=(T2
*)malloc(STACK_INIT_SIZE*sizeof(T2));
if(!S.base)
exit
(overflow);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
ok;
}//初始化栈函数模板
template
<typename
T1,typename
T2>
Status
Push(T1
&S,T2
e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(T2
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(T2));
if(!S.base)
exit
(overflow);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return
ok;
}//入栈函数模板
template
<typename
T1,typename
T2>
Status
Pop(T1
&S,T2
&e)
{
if(S.top==S.base)
return
error;
e=*--S.top;
return
ok;
}//出栈函数模板
template
<typename
T1,typename
T2>
T2
GetTop(T1
S)
{
if(S.top==S.base)
return
error;
else
return
*(S.top-1);
}//获取栈顶元素模板
Status
In(char
Test,char*
TestOp)
{
bool
Find=false;
for
(int
i=0;
i<
OPSETSIZE;
i++)
{
if
(Test
==
TestOp[i])
Find=
true;
}
return
Find;
}//判断是否为运算符
float
Operate(float
a,unsigned
char
theta,
float
b)
{
switch(theta)
{
case
'+':
return
a+b;
case
'-':
return
a-b;
case
'*':
return
a*b;
case
'/':
return
a/b;
default
:
return
0;
}
}//运算
int
ReturnOpOrd(char
op,char*
TestOp)
{
int
i;
for(i=0;
i<
OPSETSIZE;
i++)
{
if
(op
==
TestOp[i])
return
i;
}
return
0;
}
char
precede(char
Aop,
char
Bop)
{
return
Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}//ReturnOpOrd和precede组合,判断运算符优先级
float
EvaluateExpression()
{
//
算术表达式求值的算符优先算法。
//
设OPTR和OPND分别为运算符栈和运算数栈,OPSET为运算符集合。
SqStack<char>
OPTR;
//
运算符栈,字符元素
SqStack<float>
OPND;
//
运算数栈,实数元素
char
TempData[20];
float
Data,a,b;
char
theta,c,x,Dr[2];
InitStack<SqStack<char>,char>
(OPTR);
Push
(OPTR,
'#');
InitStack
<SqStack<float>,float>(OPND);
strcpy(TempData,"\0");//将TempData置为空
c=getchar();
while
(c!=
'#'
||
GetTop<SqStack<char>,char>(OPTR)!=
'#')
{
if
(!In(c,
OPSET))
{
Dr[0]=c;
Dr[1]='\0';//存放单个数
strcat(TempData,Dr);//将单个数连到TempData中,形成字符串
c=getchar();
if(In(c,OPSET))//如果遇到运算符,则将字符串TempData转换成实数,入栈,
并重新置空
{
Data=(float)atof(TempData);
Push(OPND,
Data);
strcpy(TempData,"\0");
}
}
else
{
//
不是运算符则进栈
switch
(precede(GetTop<SqStack<char>,char>(OPTR),
c))
{
case
'<':
//
栈顶元素优先权低
Push(OPTR,
c);
c=getchar();
break;
case
'=':
//
脱括号并接收下一字符
Pop(OPTR,
x);
c=getchar();
break;
case
'>':
//
退栈并将运算结果入栈
Pop(OPTR,
theta);
Pop(OPND,
b);
Pop(OPND,
a);
Push(OPND,
Operate(a,
theta,
b));
break;
}
//
switch
}
}
//
while
return
GetTop<SqStack<float>,float>(OPND);
}
//
EvaluateExpression
void
main()
{
printf("请输入表达式(end
#):\n");
printf("%f\n",EvaluateExpression());
}
给你一个完全的程序,本人自己写的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
强奸罪判多少年可以缓刑吗 20句充满着正能量的最励志的英语名言 如何通过cet-4? 去赤道几内亚,需要带什么行李,生活用品,在那边大概生活一年,什么东西... 去赤道几内亚需要准备什么?主要要预防什么疾病?要准备什么预防药品... 可惜!大部分消费者在交易后会取消亚马逊Prime会员资格 想问下 cpu i7 4900mq. gtx765m显卡. 32G内存 能大部分游戏效果开高么... i7 4800MQ i7 4900MQ 能有多大差别? 外星人14,显卡GTX765M。玩... 三星k2200打印机怎么升级 三星k2200打印机怎么升级br? 三星k2200打印机如何双面打? 数据结构课程设计 表达式求解问题 求一C程序 三项电多久不用会被消户? ...号在最近24小时内绑定过三个,已达到限制,...24小时后可以再次... 在建工程若要抵押的话,是先办理土地抵押手续,还是去房管局办在建工程... 我的手机是三星i9100。在设置里有个无线和网络,里有个网络... 有宝妈在生了宝宝后感觉自己抑郁了吗?1 以前生完孩子就下地干活了,现在的宝妈怎么这么娇气 我要买手机,但是我还未成年,市民卡能不能代替身份证去买手机的...1 为什么生完宝宝后 宝妈情绪变化大易怒易哭 广州积分入户条件最新政策2022 离婚后还可以要回孩子吗 刑事报案后一个月,公安局说没捉人,还有细节要问。3 我去年在厂里发生工伤,鉴定出六级!现在谈赔偿,厂里说要我自己负责(不按... 没上班医保卡有余额可以用吗 汽车上显示跟摄像头差不多的图像是什么意思2 汽车显示屏类似跟摄像机样的是什么灯 作文论据,有哪位年纪大了还去努力学习的名人 数据结构后缀表达式计算器11 如果我还是一个小学生的作文400字9 电加热海盐热敷包作用和使用注意事项有哪些?103 雪落到地上为什么变成水46 小车仪表台像摄象机的灯亮是什么意思14 一个人能同时在两个手机上上课吗? 同一个手机号注册了两个微信,第一登不上了怎么办? 怎样找回原来注册的和密码 一张身份证绑定两个一个能用零钱支付一个不能用怎么回事?_百度... 面试官如何提高面试体验? 青年卡有实卡能用自动取款机吗 英语题292 在建工程如果停建,什么时候开始停止利息资本化?相关规... 斯柯达明锐仪表盘上的类似摄像机的灯亮了 修改一年内如何二次修改吗苹果 用尿不湿热敷囟门的危害 夏天下冰雹的原理90 冰雹在下降的过程中经过大气层为什们不会融化?7 雨、雪、云、雾、露、霜、冰雹的成因是升华还是凝华还是液化还是...70 ...对别人狠的人不一定是不好的,但对自己狠的人一定是善 wxid开头的如何添加好友? 生完宝宝后,宝妈变白了,怎么回事 彭春波教高考数学怎么样?