栈在表达式计算过程中的应用

栈在表达式计算过程中的应用 :建立操作数栈和运算符栈。运算符有优先级。
规则
自左至右扫描表达式,凡是遇到操作数一律进操作数栈。
当遇到运算符时,如果它的优先级比运算符栈栈顶元素的优先级高就进栈。反之,取出栈顶运算符和操作数栈栈顶的连续两个操作数进行运算,并将结果存入操作数栈,然后继续比较该运算符与栈顶运算符的优先级。
左括号一律进运算符栈,右括号一律不进运算符栈,取出运算符栈顶运算符和操作数栈顶的两个操作数进行运算,并将结果压入操作数栈,直到取出左括号为止。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX  100enum link{PUSH, PUSH_NO};typedef struct      // 运算数
{int num[MAX];int top;
}OP_num;typedef struct      // 运算符
{char str[MAX];int top;
}OP_ch;// 运算数置空栈
void SETNULL_num (OP_num* s)        
{s->top = -1;
}// 运算符置空栈
void SETNULL_ch (OP_ch* s)
{s->top = -1;
}// 判断是否是数字,是返回1 不是返回0
int is_num (char ch)    
{if (ch >= '0' && ch <= '9'){return 1;}else{return 0;}
}       // 数字入栈
int PUSH_num (OP_num *s, int data)
{if ((MAX - 1) == s->top){return 0;}else{   s->num[++s->top] = data;}
}// 运算符入栈
int PUSH_ch (OP_ch* s, char ch)
{if ((MAX - 1) == s->top){return 0;}else{s->str[++s->top] = ch;}
}// 判断是否将运算符入栈
int jud (OP_ch* s, char ch)
{if (-1 == s->top)   // 判断是否是空栈{return PUSH;}else{switch (s->str[s->top])     // 根据栈顶运算判断是否进栈{case '+':           //  当栈顶是'+-'时,只有‘+-)’不进栈case '-':{if (ch == '+' || ch == '-' || ch == ')'){return PUSH_NO;}else{return PUSH;}break;}case '*':case '/':{if ('(' == ch){return PUSH;}else{return PUSH_NO;}break;}case '(':{return PUSH;break;}}}
}// 数字出栈
int Pop_num (OP_num* s)
{return (s->num[s->top--]);
}// 运算符出栈
void Pop_ch (OP_ch* s)
{s->top--;
}// 进行运算
void operate (OP_ch* s_ch, OP_num* s_sum)
{int a = Pop_num(s_sum);                     // 取第一个数int b = Pop_num(s_sum);                     // 取第二个数int result;// 根据当前运算符栈顶的符号来判断进行何种运算switch (s_ch->str[s_ch->top]){case '+':result = a + b;break;case '-':result = b - a;break;case '*':result = a * b;break;case '/':result = b / a;break;}   PUSH_num (s_sum, result);                   // 将运算结果入栈
}int main()
{OP_num sdata;OP_ch  soper;SETNULL_num (&sdata);SETNULL_ch  (&soper);int i = 0, len_str, t;char str[MAX];char str_num[MAX];          // 存放要转化的数字gets (str);                 // 输入表达式len_str = strlen (str);     // 获取表达式长度while (str[i] != '\0')      // 遍历表达式{if (is_num(str[i]))     // 判断是否是数字{t = 0;while (is_num(str[i])){str_num[t++] = str[i++];//将表达式中的数字进行保存,用于转化为对应的整形数}str_num[t] = '\0';PUSH_num (&sdata, atoi(str_num));// 遇到算数符号的时候让符号前面的数进栈}else{if (PUSH == jud(&soper, str[i])){PUSH_ch (&soper, str[i]);}else{if (str[i] != ')')      // ')'不让其入栈所以单独列出来讨论{operate (&soper, &sdata);       // 进行一次运算并一处栈顶运算符Pop_ch(&soper);                 // 符号出栈PUSH_ch (&soper, str[i]);       // 进行压栈// 相当于用当前的运算符替换了刚才栈顶的运算符号}else                // 遇到')'// 不断取字符运算 知道遇到 ')'{do{operate (&soper, &sdata);Pop_ch (&soper);}while (soper.str[soper.top] != '(');Pop_ch (&soper);// 将‘(’弹出栈空间}}i++;}}while (soper.top != -1){operate (&soper, &sdata);Pop_ch (&soper);}printf ("%d\n", sdata.num[sdata.top]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python-02-基础知识

一、第一个Python程序 【第一步】新建一个hello.txt 【第二步】将后缀名txt改为py 【第三步】使用记事本编辑该文件 【第四步】在cmd中运行该文件 print("Hello World!") 强调&#xff1a;python解释器执行程序是解释执行&#xff0c;即打开文件读内容&#xff0c;因…

数据结构之树的一些基本操作

树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点&#xff0c;所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位&#xff0c;这个结点称为该树的…

利用FS寄存器获取KERNEL32.DLL基址算法的证明(ZZ)

转自&#xff1a;http://blog.csdn.net/int2e/archive/2008/01/09/2032732.aspxFS寄存器指向当前活动线程的TEB结构&#xff08;线程结构&#xff09; 偏移 说明 000 指向SEH链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberData 014 ArbitraryUse…

很老很老的老偏方,小病一扫光

1、洋葱、生姜治头皮屑 ①将一个的洋葱头用纱布包好&#xff0c;用它揉擦头皮&#xff0c;24小时后用温水洗头&#xff0c;即可止头痒&#xff0c;除头皮屑。 ②先将生姜切片&#xff0c;放入锅里煮沸&#xff0c;待水温不烫的时候倒上适量醋&#xff0c;加水洗头。 2、小白果…

script 放置最佳位置以及 html 执行顺序

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 看到知乎上有很多讨论关于javascript位置的文章。所以特意留意了这方面的问题。 首先要了解到的是&#xff1a; html文件是自上而下的执…

677A

#include <stdio.h> int main() {int n, h;scanf("%d%d", &n, &h);int temp, width0;int i;for(i0; i<n; i){scanf("%d", &temp);if(temp<h)width;elsewidth2;}printf("%d\n", width);return 0; }转载于:https://www.cn…

数据结构之二叉树的一些基本操作

二叉树是树的特殊一种&#xff0c;具有如下特点&#xff1a;1、每个结点最多有两颗子树&#xff0c;结点的度最大为2。2、左子树和右子树是有顺序的&#xff0c;次序不能颠倒。3、即使某结点只有一个子树&#xff0c;也要区分左右子树。 头文件 BTree.h #ifndef __BTREE_H__ …

【Arduino】使用C#实现Arduino与电脑进行串行通讯

在给Arduino编程的时候&#xff0c;因为没有调试工具&#xff0c;经常要通过使用串口通讯的方式调用Serial.print和Serial.println输出Arduino运行过程中的相关信息&#xff0c;然后在电脑上用Arduino IDE的Serial Monitor来查看print出来的信息。Serial Monitor不仅可以接受Ar…

虚拟机NAT模式联网

阿里开源镜像软件&#xff1a;https://opsx.alibaba.com/mirror 如何使VMware ip与本机ip处于同一网段 https://blog.csdn.net/kakuma_chen/article/details/71425620 转载于:https://www.cnblogs.com/cdy0626/p/11131440.html

VS2008下最新X264(svn 2009.9)编译不过的解决办法

总有人说最新的版本 编译不过&#xff0c;搞的群、 论坛里到处都是这种求助贴。建议斑竹把这个解决办法放到醒目的位置&#xff0c;以减少噪音。科普开始1、编译问题由于MS的VS编译器对C99标准支持不好&#xff0c;不支持函数当中混合定义、声明变量。解决办法&#xff1a;在函…

node、npm、vue安装 -- VUE 项目 demo 实例

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 安装node&#xff1a; sudo yum install epel-release sudo yum install nodejs node --version // 安装好后查看版本2. 安装 npm …

用C语言实现简单的停车场管理

这个程序是利用栈和循环队列实现的&#xff0c;自己得先处理好逻辑关系就好了。由于题目没有要求&#xff0c;这个程序就没加重复判断&#xff0c;比如一辆车已经停在车位上或者便道上&#xff0c;再来一辆就判断不了了。关于栈&#xff0c;就是先进后出的思想&#xff0c;队列…

推荐一个配置linux服务的网站

该网站的各种linux服务的配置都是基于CentOS系统的 基本上各种linux服务都有了 http://www.server-world.info/en/转载于:https://www.cnblogs.com/Skyar/p/3582389.html

mariadb数据库增删改查

1.常用数据类型 1&#xff09;整数:int, bit 2&#xff09;小数:decimal    #decimal(5,2)表示共有五位数&#xff0c;保留两位小数 3&#xff09;字符串:varchar, char   4&#xff09;日期时间:date, time, datetime 5&#xff09;枚举类型(enu…

为什么你工作努力却没有起色?

成为职场达人&#xff0c;未必要经常挑灯夜战。相反&#xff0c;注意到下面几条&#xff0c;会让你少走弯路。 1&#xff09;成长的机会永远比眼前的待遇重要——做重要的事比多拿钱重要。 我知道在水木bbs上的worklife版本&#xff0c;每天都在上演的就是比较自己的第一个o…

《 Spring 实战 》(第4版) 读书笔记 (未完结,更新中...)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Pxx 表示在书的第 xx 页。 Spring 框架的核心是 Spring 容器。 1. (P7.) 构造器注入是依赖注入的方式之一。 紧耦合&#xff1a;在 …

数据结构排序法之希尔排序法(Shell Sort)

希尔排序&#xff0c;也叫递减增量排序&#xff0c;是插入排序的一种更高效的改进版本。希尔排序是不稳定的排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&#xff1a; 1、插入排序在对几乎已经排好序的数据操作时&#xff0c;效率高&#xff0c;即可以达…

Windows To Ghost系统封装之必备软件集 - 好压

好压压缩软件&#xff08;HaoZip&#xff09;是强大的压缩文件管理器&#xff0c;是完全免费的新一代压缩软件&#xff0c;相比其它压缩软件系统资源占用更少&#xff0c;有更好的兼容性&#xff0c;压缩率比较高。 它提供了对ZIP、7Z和TAR文件的完整支持&#xff0c;能解压RAR…

js 弹窗并定时关闭

1. $(input).click(function() {prompt(点击成功, 2000) })function prompt(newName, time, fn) {var $div $(<div></div>);$div.css({position: fixed,top: 0,left: 0,width: 100%,height: 100%,z-index: 200,background-color: rgba(0,0,0,0.4),// background-c…

数据结构排序法之插入法

插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌。 对于未排序数据(右手抓到的牌)&#xff0c;在已排序序列(左手已经排好序的手牌)中从后向前扫描&#xff0c;找到相应位置并插入。 插入排序在实现上&#xff0c;通常采用in-place排序&#xff08;即…