c语言作业算术表达式求值,算术表达式求值演示(C语言版)
//头文件预处理命令
#include
#include
//----------函数结果状态代码-----------------
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
//----------定义函数类型,返回结果状态代码--------
typedef int Status;
//-----------定义栈的元素类型------------
typedef int ElemType;
//---------栈的顺序存储表示------------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
//-----------顺序栈的定义,并定义栈顶和栈底元素-----------
typedef struct{
ElemType *base;
ElemType *top;
int stacksize;
}Stack;
//--------基本操作的函数原型说明-----------
Status IfEmptyStack(Stack S);
Status InitStack (Stack &S);
Status EmptyStackEmpty(Stack &S);
Status GetTop(Stack S,ElemType &e);
Status Push(Stack &S,ElemType e);
Status Pop(Stack &S,ElemType
&e);
Status ShowStack(Stack S);
Status Evaluateexpression_r();
//-------------In函数-----------------
int In(char ch);
char Precede(char a, char b);//判定运算符栈的栈顶运算符i与读入的运算符j之间优先关系的函数
int Operate(int a, char f, int b);
//--------基本操作的算法描述---------------
Status IfEmptyStack(Stack S){
if(S.base==S.top)
return
1;
return
0;
}//IfEmptyStack
Status InitStack(Stack &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 1;
}//InitStack
Status EmptyStack(Stack &S){
S.top=S.base;
return OK;
}//EmptyStack
Status GetTop(Stack S) {
//若栈不空,则用e返回S的栈顶元素,并返回OK,否则,返回ERROR
ElemType e;
e=*(S.top-1);
return e;
}//GetTop
Status Push(Stack &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;
}//Push
Status Pop(Stack &S,ElemType
&e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//Pop
Status ShowStack(Stack S){
ElemType *p=S.base;
while(p!=S.top)
printf("%d",*p++);
return 1;
}//ShowStack
int In(char ch){
int
res;
switch(ch)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#': res=1;break;
default: res=0;break;
}
return
res;
}//In
char Precede(char a, char b){
int
i,j;
int
form[7][7]=
{
{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}
};
switch(a)
{
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '(':i=4;break;
case ')':i=5;break;
case '#':i=6;break;
}
switch(b)
{
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '(':j=4;break;
case ')':j=5;break;
case '#':j=6;break;
}
if(form[i][j]==1)
return '>';//i的优先级高于j
else
if(form[i][j])
return '
else
return '=';//i的优先级等于j
}//Precede
int Operate(int a, char f, int b){
switch(f)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
}
return
0;
}//Operate
//-------------核心算法-------------------------
Status Evaluateexpression_r(){
//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和运算数栈
char c,
d[100];
int i, f,
num, tmpa, tmpb;
Stack OPTR,
OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR,
'#');
c=getchar();
while(c!='#'||GetTop(OPTR)!='#') {
if(c>='0'&&c<='9') {
i=0;
do{
d[i++]=c;
c=getchar();
}while(c>='0'&&c<='9');
d[i]='\0';
num=atoi(d);
Push(OPND, num);
}//if
else if(In(c)) {
switch(Precede(GetTop(OPTR), c)){
case '
Push(OPTR, (int)c);c=getchar();
break;
case '=': //脱括号并接收下一字符
Pop(OPTR, f);c=getchar();
break;
case '>': //退栈并将运算结果入栈
Pop(OPTR, f);
Pop(OPND, tmpb); Pop(OPND, tmpa);
Push(OPND, Operate(tmpa, f, tmpb));
c语言作业算术表达式求值,算术表达式求值演示(C语言版)相关推荐
- 湖南师范大学c语言作业答案,2017年湖南师范大学物理与信息科学学院845C语言程序设计考研题库...
一.选择题 1. 有以下程序 程序运行后的输出结果是( ). A.24 B.44 C.22 D.46 [答案]B [解析]p 是int 类型的指针,指向数组a 的首元素:k 的int*类型的指针,指向 ...
- 南邮c语言作业平台,“像妈妈一样关心爱护学生”南邮C语言老师教课20年收获学生“2本留言册”的暖心赞美...
"我感觉我好像是撒了一把爱的种子,但现在是漫山遍野的花回馈给我,这种幸福难以言表!"说这话的是南京邮电大学的严英老师,今年是她在南邮工作的第20年,她教授的<高级语言程序设计 ...
- 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值
栈的设计与使用 实验内容 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值 解题思路 (1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式( ...
- c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言研究性学习的路线 现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常"误导"读者,于是,"死记 ...
- 假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移
假设我们在对有符号值使用补码运算的32位机器人运行代码.对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移.变量的声明和初始化如下: int x = foo(); //任意值 int y = ...
- c语言表达式1 33的值是,2015年计算机二级C语言测试题及答案(1)
1.(A )是构成C语言程序的基本单位. A.函数 B.过程 C.子程序 D.子例程 2.C语言程序从 C 开始执行. A. 程序中第一条可执行语句 B. 程序中第一个函数 C. 程序中的main函数 ...
- C++核心准则T.123:使用常量表达式函数在编译时求值
T.123: Use constexpr functions to compute values at compile time T.123:使用常量表达式函数在编译时求值 Reason(原因) A ...
- c语言的表达式2 4 6 8的值,C语言程序设计测试题二
一.判断题(每题2分,共8分) 1.若有int ⅰ=10, j=0; 则执行完语句if (j=0)ⅰ+ +; else ⅰ- -; ⅰ的值为11.() 2.若有 int ⅰ=5, j=10; 则执行完 ...
- c语言 运算符op,1 简单计算器。请编写一个程序计算表达式:datal op data2的值。其中op为运算符+、—、*、/。...
满意答案 770vivozf 2013.03.02 采纳率:43% 等级:9 已帮助:769人 1.简单计算器.请编写一个程序计算表达式:datal op data2的值.其中op为运算符+.- ...
- 数组求fibnocci用c语言,c语言作业.docx
c语言作业.docx C语言_实验五.数组程序设计 13275016 刘勇一.实验目的1. 掌握一维数组的定义及初始化.2. 掌握一维数组元素的引用及其应用.二.实验设备Pc机.vc6.0二.实验内容 ...
最新文章
- tcp/ip 协议栈Linux内核源码分析七 路由子系统分析二 策略路由
- 释放C盘空间27招具体优化技巧
- java计算时间差距_硬计算和软计算之间的差异
- Redis 数据库、键过期的实现
- Bootstrap 重置样式
- OpenCv之Canny边界检测(笔记13)
- linux主题管理器,XFCE 主题管理器:一款单一的GUI主题管理器,更改任何XFCE主题(带预览)...
- kali 安装volatility_电子取证技术之实战Volatility工具
- nio2 java_java nio2
- 一天一个小算法的学习之选择排序
- 【线性代数】理解正定矩阵和半正定矩阵
- 高德h5定位误差_高德地图定位JS API不准确问题
- Latex通过bib文件转出bbl文件
- pygame之Surface模块
- MMDetection3D 1.1:统一易用的 3D 感知平台
- 打卡伦敦博物馆,在时空之旅中探索你未知的城市
- 西门子博途1500双驱同步,伺服同步运行程序,3轴码垛博途程序,scl项目,同步轴走PN工艺对象
- 帕累托改进和帕累托最优、卡尔多-希克斯改进
- 元宇宙创造的新世界变成了统一的个体
- 一款集成度高的渗透工具:Railgun
热门文章
- Go开发之路 -- Go语言基本语法 - 作业
- python b64 图片处理
- spring-mvc注解
- 1013. 数素数 (20)
- nginx已添加systemctl,但不能开机自启动问题
- cocos2d-x的win32编译环境
- 重装windows2003遇到的老问题:0X0000007B和显卡驱动安装不上。
- 微软推出MSDN2008中文版有些仓促,中文的MSDN2008Beta2内容都是E文的...
- linux安装python虚拟环境_linux环境下安装python虚拟环境及注意事项
- python查找文件内容_python 查找文件内容