6.<1>四则运算的研究[栈]
计算1+2*3=,这个程序还是比较绕的,先将程序简化,只做+-*/和=五个运算符的关系。首先,假定这五个运算符中,=号的优先级最低,其次是+-,最高为*/。接着约定,"1+2*3=",为字符串。
第一步,将=号入栈,作为栈底。然后,再依次进行后续的比较。
约定:栈顶符号<字符串符号,则字符串符号入栈。栈顶符号>=字符串符号的,则进行计算!
分步来说,首先取字符1,为数字,则入数据栈,接着取字符+,由于初始化时,栈中只有一个=号,也即为栈顶,两者比较,根据约定,+号入符号栈,接着为2,入数据栈。接着*号,由于栈顶小于字符串的优先级,因为此时的栈顶是+号,所以*号入符号栈,再接着3,入数据栈,最后是等号。
直到等号时,字符串的符号才小于栈顶,根据约定要计算。
计算规则:
(1)符号栈,出(一个)栈顶符号
(2)数据栈取出两数据,配合栈顶符号进行计算。
根据计算规则,取出*号,然后,再取出3和2,得到6,并将之存入到数据栈中。
再拿栈顶与字符比较,此时,由于*号已经出栈,剩下+号,再比较,还是>字符串中的=号,所以再计算。得到1+6=7,将7入数据栈。此时,栈顶就是=号,然后再拿=号和=号进行比较,则循环判定结束,最后返回数据栈中的元素就是最后的结果!
- /*-------------完整程序@映雪---2016/3/16-------------*/
- #include <iostream>
- using namespace std;
- #define MAXSIZE 50
- typedef struct stack
- {
- int data[MAXSIZE];
- int top;
- }Stack;
- void init(Stack &s)
- {
- s.top=-;
- }
- void push(Stack &s,int e) /*入栈*/
- { s.data[++s.top]=e; }
- int pop(Stack &s) /*出栈*/
- { return s.data[s.top--];}
- int peek(Stack &s) /*取栈顶数据*/
- { return s.data[s.top];}
- int check(char c) //检查字符是否为运算符
- {
- switch(c)
- {
- case'+':
- case'-':
- case'*':
- case'/':
- case'=':
- return ;
- break;
- default:
- return ;
- break;
- }
- }
- int compare(char x,char c) //判断两个运算符的优先级
- // oper1大于oper2的优先级,返回1
- //oper1小于oper2的优先级,返回-1
- //oper1等于oper2的优先级,返回0
- {
- int pri;
- switch(c) //判断运算符优先级
- {
- case '+':
- case '-':
- if(x=='('||x=='=') //为左括号或表达式开始符号
- pri=-; //返回小于
- else
- pri=;
- break;
- case '*':
- case '/':
- if(x=='*'||x=='/'||x==')')
- pri=;
- else
- pri=-;
- break;
- case '=' :
- if(x=='(')
- {
- cout<<"括号不匹配!\n";
- exit();
- }else if(x=='=')
- pri=;
- else
- pri=;
- break;
- }
- return pri;
- }
- int Calc(int a,int oper,int b) //计算两个操作数的结果
- {
- switch(oper)
- {
- case'+':return a+b;
- case'-':return a-b;
- case'*':return a*b;
- case'/':
- if(b!=)
- return a/b;
- else
- {
- cout<<"除0溢出!\n";
- exit();
- }
- }
- }
- int CalcExp(char exp[]) //表达式计算函数
- {
- Stack A,B;
- int i=,flag=;
- int a,b,t;/*a,b为数据栈中取出的数据,t为a与b的计算结果*/
- int c,q,x,oper;
- init(A); //初始化两个栈
- init(B);
- q=;
- x='=';
- push(B,x); //首先将等号(=)进入操作符栈
- c=exp[i++];/*取字符串的第一个字符*/
- while(c!='=' || x!='=')/*判定最终完成计算的条件*/
- {
- if(check(c)) //若输入的是运算符
- {
- if(flag) /*有未入栈的操作数,则操作数入栈*/
- {
- push(A,q);//将操作数入栈
- q=;
- flag=;
- }
- switch(compare(x,c)) //判断运算符的优先级
- {
- case -:
- push(B,c);//运算符进栈
- c=exp[i++];
- break;
- case :
- c=pop(B); //运算符出栈 (抛弃)
- c=exp[i++];
- break;
- case :
- oper=pop(B); //运算符出栈
- b=pop(A);//两个操作数出栈
- a=pop(A);
- t=Calc(a,oper,b);
- push(A,t);//运算结果入栈
- break;
- }
- }
- else if(c>=''&&c<='') //若输入字符在0~9之间
- {
- c-='';
- q=q*+c;/* 计算数字的总数 */
- c=exp[i++];
- flag=;
- }
- else
- {
- cout<<"输入错误!\n";
- exit();
- }
- x=peek(B);//获取栈顶的运算符
- }
- q=pop(A);/*出栈最终结果*/
- return q;
- }
- int main()
- {
- char exp[];
- cout<<"请输入要计算的表达式(以=结束):";
- cin>>exp;
- cout<<exp<<CalcExp(exp);
- return ;
- }
6.<1>四则运算的研究[栈]的更多相关文章
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
- LeetCode OJ 题解
博客搬至blog.csgrandeur.com,cnblogs不再更新. 新的题解会更新在新博客:http://blog.csgrandeur.com/2014/01/15/LeetCode-OJ-S ...
- esp和ebp详解
最近在研究栈帧的结构,但总是有点乱,所以写了一个小程序来看看esp和ebp在栈帧中的作用.这个程序如下: 这个程序很简单,就是求两个数的值,然后输出即可.所以首先把它用gcc编译链接成a.out,进入 ...
- (C/C++学习笔记) 十. 函数
十. 函数 ● 基本概念 函数 函数定义 function definition: return_type function_name ( parameter list ) { Body of fun ...
- 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器
在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...
- C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式
上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上篇文章链接:C++做四则运算的MFC计算器(一)MFC界 ...
- 三道题(关于虚表指针位置/合成64位ID/利用栈实现四则运算)
第一题 C++标准中,虚表指针在类的内存结构位置没有规定,不同编译器的实现可能是不一样的.请实现一段代码,判断当前编译器把虚表指针放在类的内存结构的最前面还是最后面. 第二题 在游戏中所有物品的实例 ...
- java学习之—使用栈实现字符串数字四则运算
/** * 使用栈存储后缀表达式 * Create by Administrator * 2018/6/13 0013 * 下午 2:25 **/ public class StackX { priv ...
- C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...
随机推荐
- tar 压缩文件指定目录
tar -cjf /app/tmp/app/test.tar.bz2 -C /app/tmp res_test.csv 将/app/tmp 目录下 res_test.csv文件压缩到/app/tmp ...
- protocol_link
蔡燧林:1992—2000年教育部考试中心研究生数学命题组组长现在退休养老.要想办法弄到他编的书(ps:别问怎么弄到,我和我同学都能弄到,你怎么会不能弄到呢)李林:目前在导航独家授课,他能屡屡命中考研 ...
- delphi 颜色转换函数总结
unit UColor; interface uses windows, sysutils, classes, graphics; function HexToInt(Hexa: String): L ...
- select 中添加option的注意
在平时写JS中经常要给Select添加option,如果我们把option中的数据用一个字符串来表示: eg: var strOption='<option>1</option> ...
- localstorage是什么,它有哪些作用
localStorage作为HTML5本地存储web storage特性的API之一,主要作用是将数据保存在客户端中,而客户端一般是指上海网站设计用户的计算机.在移动设备上,由于大部分浏览器都支持 w ...
- win10下关于apache配置虚拟主机
apache安装完默认是不开启虚拟服务器的,如果希望在本地apache上面配置虚拟服务器,类似于在网上买的虚拟主机,可以按照以下步骤进行配置: 1,修改本机的hosts文件,如下 示例:127.0.0 ...
- 实例学习SSIS(一)
网址: http://www.cnblogs.com/tenghoo/archive/2009/10/archive/2009/10/archive/2009/10/archive/2009/10/a ...
- javascript基础代码
1.点击改变HTML内容 <html> <head> <meta charset="UTF-8"> <script> functio ...
- luoguP1064 金明的预算方案 (有依赖的背包问题)
题目链接:https://www.luogu.org/problemnew/show/P1064 这是一个有依赖的背包问题,属于01背包的变式.这题还好,每个主件最多有2个附件,那么在对主件进行背包的 ...
- ECMAScript5之JSON对象属性的遍历顺序
测试浏览器 Chrome.Safari 一 键可以用parseInt解析成整数的,按数值升序顺序. var intObj = { '3.3' : 3.3, '2' : 222, '1' :111 } ...