//头文件预处理命令

#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语言版)相关推荐

  1. 湖南师范大学c语言作业答案,2017年湖南师范大学物理与信息科学学院845C语言程序设计考研题库...

    一.选择题 1. 有以下程序 程序运行后的输出结果是( ). A.24 B.44 C.22 D.46 [答案]B [解析]p 是int 类型的指针,指向数组a 的首元素:k 的int*类型的指针,指向 ...

  2. 南邮c语言作业平台,“像妈妈一样关心爱护学生”南邮C语言老师教课20年收获学生“2本留言册”的暖心赞美...

    "我感觉我好像是撒了一把爱的种子,但现在是漫山遍野的花回馈给我,这种幸福难以言表!"说这话的是南京邮电大学的严英老师,今年是她在南邮工作的第20年,她教授的<高级语言程序设计 ...

  3. 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值

    栈的设计与使用 实验内容 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值 解题思路 (1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式( ...

  4. c语言如何求一个数学表达式的值,浅谈C语言中表达式的求值

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言研究性学习的路线 现行的多数C语言教材有太多的误区,不仅不能给读者提供有效的学习线索,还常常"误导"读者,于是,"死记 ...

  5. 假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移

    假设我们在对有符号值使用补码运算的32位机器人运行代码.对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移.变量的声明和初始化如下: int x = foo(); //任意值 int y = ...

  6. c语言表达式1 33的值是,2015年计算机二级C语言测试题及答案(1)

    1.(A )是构成C语言程序的基本单位. A.函数 B.过程 C.子程序 D.子例程 2.C语言程序从 C 开始执行. A. 程序中第一条可执行语句 B. 程序中第一个函数 C. 程序中的main函数 ...

  7. C++核心准则​T.123:使用常量表达式函数在编译时求值

    T.123: Use constexpr functions to compute values at compile time T.123:使用常量表达式函数在编译时求值 Reason(原因) A ...

  8. c语言的表达式2 4 6 8的值,C语言程序设计测试题二

    一.判断题(每题2分,共8分) 1.若有int ⅰ=10, j=0; 则执行完语句if (j=0)ⅰ+ +; else ⅰ- -; ⅰ的值为11.() 2.若有 int ⅰ=5, j=10; 则执行完 ...

  9. c语言 运算符op,1 简单计算器。请编写一个程序计算表达式:datal op data2的值。其中op为运算符+、—、*、/。...

    满意答案 770vivozf 2013.03.02 采纳率:43%    等级:9 已帮助:769人 1.简单计算器.请编写一个程序计算表达式:datal op data2的值.其中op为运算符+.- ...

  10. 数组求fibnocci用c语言,c语言作业.docx

    c语言作业.docx C语言_实验五.数组程序设计 13275016 刘勇一.实验目的1. 掌握一维数组的定义及初始化.2. 掌握一维数组元素的引用及其应用.二.实验设备Pc机.vc6.0二.实验内容 ...

最新文章

  1. tcp/ip 协议栈Linux内核源码分析七 路由子系统分析二 策略路由
  2. 释放C盘空间27招具体优化技巧
  3. java计算时间差距_硬计算和软计算之间的差异
  4. Redis 数据库、键过期的实现
  5. Bootstrap 重置样式
  6. OpenCv之Canny边界检测(笔记13)
  7. linux主题管理器,XFCE 主题管理器:一款单一的GUI主题管理器,更改任何XFCE主题(带预览)...
  8. kali 安装volatility_电子取证技术之实战Volatility工具
  9. nio2 java_java nio2
  10. 一天一个小算法的学习之选择排序
  11. 【线性代数】理解正定矩阵和半正定矩阵
  12. 高德h5定位误差_高德地图定位JS API不准确问题
  13. Latex通过bib文件转出bbl文件
  14. pygame之Surface模块
  15. MMDetection3D 1.1:统一易用的 3D 感知平台
  16. 打卡伦敦博物馆,在时空之旅中探索你未知的城市
  17. 西门子博途1500双驱同步,伺服同步运行程序,3轴码垛博途程序,scl项目,同步轴走PN工艺对象
  18. 帕累托改进和帕累托最优、卡尔多-希克斯改进
  19. 元宇宙创造的新世界变成了统一的个体
  20. 一款集成度高的渗透工具:Railgun

热门文章

  1. Go开发之路 -- Go语言基本语法 - 作业
  2. python b64 图片处理
  3. spring-mvc注解
  4. 1013. 数素数 (20)
  5. nginx已添加systemctl,但不能开机自启动问题
  6. cocos2d-x的win32编译环境
  7. 重装windows2003遇到的老问题:0X0000007B和显卡驱动安装不上。
  8. 微软推出MSDN2008中文版有些仓促,中文的MSDN2008Beta2内容都是E文的...
  9. linux安装python虚拟环境_linux环境下安装python虚拟环境及注意事项
  10. python查找文件内容_python 查找文件内容