#include #define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

#define STACK_INIT_SIZE 100 //存储空间初始分配量

#define STACKINCREMENT 10 //存储空间分配增量

typedef char SElemType;

typedef char OperandType; //表达式求值的运算类型

typedef int Status;

typedef struct

{

SElemType *base;

SElemType *top;

int stacksize;

}SqStack;

//构造一个空栈

Status InitStack(SqStack *S)

{

S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

if(!S->base)

{

printf("内存分配失败!\n");

exit(OVERFLOW);

}

S->top = S->base;

S->stacksize = STACKINCREMENT;

return OK;

}

//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

Status GetTop(SqStack *S, SElemType *e)

{

if(S->top == S->base)

return ERROR;

*e = *(S->top - 1);

return OK;

}

//插入元素e为新的栈顶元素

Status Push(SqStack *S, SElemType e)

{

if(S->top - S->base >= STACK_INIT_SIZE) //栈满, 追加存储空间

{

S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));

if(!S->base)

{

printf("内存分配失败!\n");

exit(OVERFLOW);

}

S->top = S->base + S->stacksize;

S->stacksize += STACKINCREMENT;

}

*S->top++ = e;

return OK;

}

//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回Ok;否则返回ERROR

Status Pop(SqStack *S, SElemType *e)

{

if(S->top == S->base)

return ERROR;

*e = *--S->top;

return OK;

}

//销毁栈S,使其不复存在

Status StackDestroy(SqStack *S)

{

free(S->base);

S->base = NULL;

S->top = NULL;

S->stacksize = 0;

return OK;

}

//清空栈S,保留栈底指针

void ClearStack(SqStack *S)

{

S->top = S->base;

}

//根据教科书表3.1,判断两符号的优先关系

char Precede(char t1, char t2){

int i,j;

char pre[][7]={

//运算符之间的优先级制作成一张表格

{'>','>','','>'},

{'>','>','','>'},

{'>','>','>','>','','>'},

{'>','>','>','>','','>'},

{'','>','>','>','0','>','>'},

{'':

Pop(&OPTR, &theta); //退栈并将运算结果压入OPND中

Pop(&OPND, &b);

Pop(&OPND, &a);

Push(&OPND, Operate(a, theta, b));

break;

}

}

else if(c >= '0' && c <= '9') //c是操作数

{

i = 0;

do

{

z[i] = c;

i ++;

c = getchar();

}while(c >= '0' && c <= '9');

z[i] = 0;

d = atoi(z); //将字符数组转为整型存于d

Push(&OPND, d);

}

else //c为非法字符

{

printf("ERROR3\n");

exit(1);

}

GetTop(&OPTR, &x);

}

GetTop(&OPND, &x);

StackDestroy(&OPTR);

StackDestroy(&OPND);

return x;

}

int main()

{

printf("请输入算术表达式,负数要用(0-正数:\n");

printf("%d\n", EvaluateExpression());

return 0;

c语言precede函数怎么构造,数据结构——栈的应用(表达式求值)(C语言)相关推荐

  1. 数据结构栈之中缀表达式求值(实现计算器综合计算)

    一.思路分析: 1.通过一个index值(索引),来遍历我们的表达式. 2.如果我们发现是一个数字,就直接入数栈. 3.如果发现扫描到是一个符号,就分如下情况: (1).如果发现当前的符号栈为空,就直 ...

  2. c语言编程实现表达式求值,c语言实现表达式求值的方法

    c语言实现表达式求值的方法 发布时间:2020-06-22 16:45:46 来源:亿速云 阅读:82 作者:Leah 这期内容当中小编将会给大家带来有关c语言实现表达式求值的方法,以专业的角度为大家 ...

  3. php表达式求值,PHP实现基于栈的后缀表达式求值功能

    本文实例讲述了PHP实现基于栈的后缀表达式求值功能.分享给大家供大家参考,具体如下: 后缀表达式概述 后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左 ...

  4. 栈实现算术表达式求值

    算术表达式求值 利用栈求解的一个典型的问题是算术表达式求值,例如:"3+4*2-(1+1)#",这样的表达式计算,在计算过程中,不是读到一个运算就立即计算,而是要与后面的运算符进行 ...

  5. 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...

  6. 数据结构课程设计---------用栈来实现表达式求值

    1.需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程.利用算符优先关系,实现对算术四则混合运算表达式的求值. (1)输入的形式:表达式,例如2*(3+4)      包含的运算符只能有' ...

  7. 基于栈的后缀表达式求值(洛谷P1449题题解,Java语言描述)

    题目要求 P1449题目链接 分析 给出后缀表达式求值,就相当于没了括号,而且很直接. 我们需要使用栈结构来完成任务. Java原装的栈使用了很多synchronized,导致性能不佳,但我们也就将就 ...

  8. 数据结构 C++实现 算术表达式求值

    文章目录 一.实验目的 二.实验要求 三.代码内容 1.创建链栈并初始化 2.入栈出栈取栈顶元素 3.判断是否是运算符 4.判断运算符优先级 5.运算函数 6.总代码 四.运算结果 五.总结 一.实验 ...

  9. 数据结构 C 代码:表达式求值

    表达式求值 用C语言实现表达式求值算法.要求从键盘输入任意的包含加减乘除的算术四则运算表达式,都能求值.操作数类型可以设定为double. 1 设置运算符栈和运算数栈辅助分析算符优先关系. 2 在读入 ...

  10. 栈的应用——表达式求值

    概要 表达式求值问题可以说是一个经典问题.具体思路就是首先把输入的中缀表达式转换为后缀表达式,然后再根据后缀表达式进行计算求值. 中缀表达式转换为后缀表达式 首先我们设定运算符在进栈前与进栈后的优先级 ...

最新文章

  1. ip设置 kali 重置_在 Windows 系统中如何重置 TCP/IP 协议堆栈修复网络连接问题
  2. 从应用到内核查接口超时(中)
  3. 绘制多边形_PS学习教程!教你绘制低多边形星空效果熊猫头像
  4. AutoCAD LISP花型图案一
  5. pcb 假八层_八层板的成本却只六层的性能,PCB设计遭遇假八层该怎么办?
  6. 并发 线程交替执行_并发与并行的区别
  7. rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)
  8. 利用VMware Infrastructure SDK编程控制虚拟机集群(1)
  9. 计算机应用办公软件实训报告,办公软件实习报告
  10. 为什么Intel Realsense D435深度摄像头在基于深度的水平方向障碍物检测(避障)方案中,摄像头不宜安装太高?
  11. java获取元素创建时间,java – 动态顺序统计:在恒定时间内获取第k个元素?
  12. LeetCode 数组 容易 python
  13. iOS - 获取状态栏和导航栏尺寸(宽度和高度)
  14. 【资源】同济线性代数教材(第五版)
  15. html点击弹出文本框,html制作,点击文字超链接显示文本框,再点击文字超链接隐藏文本框...
  16. 域名是干啥用的?企业自己都记不住的域名还能发挥作用吗?
  17. iphone投影到电脑屏幕,QuickTime出现报错和黑屏的解决方案
  18. 生物信息学数据库资源 {#database}
  19. c语言编程实现dsa算法,椭圆曲线加密算法的C语言实现.doc
  20. leetcode 1499

热门文章

  1. python模拟登录浏览器_Python爬虫常用之登录(二) 浏览器模拟登录
  2. 1~3年产品经理经典面试题
  3. 计算机策略 提高网速,win10增加网速的方法_win10如何提高电脑网速
  4. Egret和LayaBox
  5. c#选择文件保存路径
  6. 计算机蓝屏代码0x0000007b,开机出现蓝屏代码0X0000007B原因分析及解决方法
  7. c语言图像对比度增强,图像对比度应用
  8. 都说直播带货不行了 国美为啥还要继续趟这个水?
  9. 软件工程师找不到工作的四个原因
  10. 拼音表大全图_【居家乐学】让拼音活起来