利用栈实现加减乘除幂功能
来源:互联网 发布:结婚照幻灯片制作软件 编辑:程序博客网 时间:2024/04/28 05:31
如何用栈来实现加减乘除幂的运算呢?应考虑下面几点。
1.分别用一个栈x存符号,另一个栈y存数值。
2.遇到数字就压栈,遇到符号ch要比较栈顶的符号与当前的符号ch,编写一个判别函数prev,若能进行运算,则返回真,不能返回假.以下是判别函数的几种情况:
(1)如果栈顶符号为* ^ / 则不用考虑输入拿来比较的符号,直接返回真。
(2)如果栈顶符号和拿来比较的符号ch为+或者-,也返回真.
(3)其他遇到栈顶元素为括号或者栈顶符号为+or-,而ch为* / ^等等情况,直接返回假。
代码如下:
bool prev(char s1,char s2 ){ //判断符号s1 与 s2 的优先级别的函数 if(s1=='^'||s1=='*'||s1=='/') //如果栈顶符号为* ^ / 则不用考虑输入拿来比较的符号,直接返回真 return true; else if((s1=='+'||s1=='-')&&(s2=='+'||s2=='-')) //如果栈顶符号和拿来比较的符号为+或者-,也返回真 return true; else return false; //其他情况都返回假 }3.编写计算函数result,并将计算结果压入栈中,注意计算的是当前输入符号ch前面的符号,计算完后要将当前符号ch压入符号栈内。
void result(char ch,SeqStack<T> &s) //计算并将计算结果压入栈中{ T x,y,result; x=s.Pop(); y=s.Pop(); switch(ch) { case '+':result=y+x;break; case '-':result=y-x;break; case '*':result=y*x;break; case '/':result=y/x;break; case '^':result=pow(y,x);break; } s.Push(result); return ;}
具体代码如下:
#include <iostream>#include <cstring>#include <cmath>#include <cstdio>#include <cstdlib>#include <assert.h>#define Max 100using namespace std;bool prev(char s1,char s2 ){ //判断符号s1 与 s2 的优先级别的函数 if(s1=='^'||s1=='*'||s1=='/') //如果栈顶符号为* ^ / 则不用考虑输入拿来比较的符号,直接返回真 return true; else if((s1=='+'||s1=='-')&&(s2=='+'||s2=='-'))//如果栈顶符号和拿来比较的符号为+或者-,也返回真 return true; else return false; //其他情况都返回假 }template <class T>class SeqStack{public: SeqStack():top(-1){} ~SeqStack(){top=-1;} T Pop(); T getTop(); void Push(T x); bool IsEmpty(); bool IsFull();private: T A[Max]; int top;};template <class T>void result(char ch,SeqStack<T> &s) //计算并将计算结果压入栈中{ T x,y,result; x=s.Pop(); y=s.Pop(); switch(ch) { case '+':result=y+x;break; case '-':result=y-x;break; case '*':result=y*x;break; case '/':result=y/x;break; case '^':result=pow(y,x);break; } s.Push(result); return ;}int main(){ SeqStack<char> x; //符号栈 SeqStack<double> y; //数值栈 char ch,c; double operand; x.Push('0'); while(1) { cin.get(ch); if(ch=='+'||ch=='-'||ch=='*'||ch=='/') //若是+-*/则要与符号栈栈顶元素比较,决定是否运算 { c=x.getTop(); //c保存当前栈顶值 while(prev(c,ch)) //符号比较返回真,则要计算,循环直到栈内能计算的符号全部计算 { result(c,y); //注意计算时使用的是符号栈中栈顶符号 x.Pop(); //弹出刚刚计算过的符号c c=x.getTop(); //c保存当前符号栈栈顶的元素进行循环 } x.Push(ch); //计算结束压入刚刚输入的符号 } else if(ch=='^'||ch=='(') //遇到符号^或者(直接压栈,不用考虑比较符号和计算 x.Push(ch); else if(ch==')') //遇到右括号,要对栈中元素进行循环计算,直到遇到左括号( { c=x.getTop(); while(c!='(') //此时的循环条件不是判断符号,遇到符号就要计算,因为括号里前面的元素,已经按优先级计算好 { result(c,y); x.Pop(); c=x.getTop(); } x.Pop(); //弹出(符号 } else if(isdigit(ch)) //是数字,放回输入流,重新输入数字,压栈 { cin.putback(ch); cin>>operand; y.Push(operand); } else if(ch=='\n') //遇到回车符,计算栈中仍未计算的数字,跳出循环 { c=x.getTop(); while(c!='0') { result(c,y); x.Pop(); c=x.getTop(); } cout<<y.Pop()<<endl;break; } } return 0;}template <class T>T SeqStack<T>::Pop(){ assert(top!=-1); T x; x=A[top]; top--; return x;}template <class T>void SeqStack<T>::Push(T x){ assert(top!=Max-1); top++; A[top]=x; return ;}template <class T>T SeqStack<T>::getTop(){ assert(top!=-1); return A[top];}template <class T>bool SeqStack<T>::IsEmpty(){ if(top==-1) return true; else return false ;}template <class T>bool SeqStack<T>::IsFull(){ if(top==Max-1)return true; else return false;}
0 0
- 利用栈实现加减乘除幂功能
- 栈的作用,实现加减乘除的功能
- 利用JavaScript实现加减乘除运算
- Java计算器实现加减乘除功能
- 栈实现加减乘除
- Android 中利用反射技术实现加减乘除
- C++-----利用括号递归实现的加减乘除
- Java实现简单计算器的加减乘除功能
- 计算器的加减乘除功能的实现
- 利用回调函数实现一个计算器,实现加减乘除操作
- 利用Lemon实现的加减乘除四则混合运算
- 运用PHP写计算器(实现加减乘除 取余数)功能
- 利用两个栈实现队列的功能
- 利用分类实现功能
- 高精度类的实现 加减乘除幂余
- 7. 使用栈实现加减乘除四则运算
- 利用java实现浏览器功能
- 利用MAPI实现电子邮件功能
- S5PV210中断处理的主要寄存器
- 关于非阻塞IO函数的学习
- Android EditText自定义密文符号
- Class.forName()用法及与new区别 详解
- C#编程基础 实验(4)
- 利用栈实现加减乘除幂功能
- Android随笔
- 矩阵求导
- 2016.4.09Test:problem1:绕口令:脑洞+hash
- NKOI 1011 锁妖塔
- tmux 安装及使用
- MyBatis批量操作_MySql
- 数据结构-二叉树的前序、中序、后序、层次遍历
- edgesForExtendedLayout