中缀表达式转后缀表达式并求值
来源:互联网 发布:淘宝论文发表可靠吗 编辑:程序博客网 时间:2024/05/16 10:42
应杨茜小师妹的请求写了这个程序,找找当年的感觉,呵呵。我把中缀转后缀并求值的代码写成了一个类,注释写的很详细,不多说。首先是类声明:
#ifndef _CALSUFFIX_H_#define _CALSUFFIX_H_#include <iostream>#include <stack>#include <string>using namespace std;//中缀转后缀并求值的类class CalSuffix{ private:string infix; //中缀表达式stack<char> oper; //存取操作符和操作数的栈,用于中缀变后缀string suffix; //后缀表达式stack<bool> intermedia; //用于存储后缀表达式的中间结果bool result; //计算结果 public:CalSuffix(); //默认构造函数CalSuffix(string input); //构造函数~CalSuffix(); //7构函数void InfixToSuffix(); //中缀转后缀void Calculate(); //求后缀表达式的值string GetSuffix(); //获取后缀表达式bool GetResult(); //获取计算结果};#endif
然后是类定义:
#include <iostream>#include <stack>#include <string>#include "calsuffix.h"using namespace std;CalSuffix::CalSuffix(){ result = false;}CalSuffix::CalSuffix(string input){ infix = input; result = false;}CalSuffix::~CalSuffix(){}void CalSuffix::InfixToSuffix(){ string::iterator infixIter; //suffix的迭代器,用于逐个字符扫描suffix //中缀转后缀 for(infixIter = infix.begin(); infixIter != infix.end(); ++ infixIter) {switch(*infixIter){ //若是V或F,直接放入后缀表达式字符串中 case 'V': case 'F':suffix += *infixIter;break; //若是(,压入操作符栈 case '(':oper.push('(');break; //若是!,压入操作符栈 case '!':oper.push('!');break; //若是&,且栈顶操作符为!或&,则将栈顶操作符放入后缀表达式并弹栈,然后将&压入操作符栈;否则直接压入 case '&':if(!oper.empty() && (oper.top() == '!' || oper.top() == '&')){ suffix += oper.top(); oper.pop();}oper.push('&');break; //若是|,且栈顶操作符为!或&或|,则将栈顶操作符放入后缀表达式并弹栈,然后将|压入操作符栈;否则直接压入 case '|':if(!oper.empty() && (oper.top() == '!' || oper.top() == '&' || oper.top() == '|')){ suffix += oper.top(); oper.pop();}oper.push('|');break; //若是),则将栈顶操作符放入后缀表达式并弹栈,直至弹出( case ')':while(oper.top() != '('){ suffix += oper.top(); oper.pop();}oper.pop();break; default: break;} } //将栈中剩余的操作符全部放入后缀表达式中 while(!oper.empty()) {suffix += oper.top();oper.pop(); }}void CalSuffix::Calculate(){ bool op1, op2; //操作数 string::iterator iter; //用于遍历suffix的迭代器 //计算后缀表达式的值 for(iter = suffix.begin(); iter != suffix.end(); ++ iter) {switch(*iter){ //若是V,直接压入中间结果栈 case 'V':intermedia.push(true);break; //若是F,直接压入中间结果栈 case 'F':intermedia.push(false);break; //若是!,弹出栈顶元素并做!运算,将结果压回栈中 case '!':op1 = intermedia.top();intermedia.pop();intermedia.push(!op1);break; //若是&,弹出栈顶两个元素并做&运算,将结果压回栈中 case '&':op1 = intermedia.top();intermedia.pop();op2 = intermedia.top();intermedia.pop();intermedia.push(op1 & op2);break; //若是|,弹出栈顶两个元素并做|运算,将结果压回栈中 case '|':op1 = intermedia.top();intermedia.pop();op2 = intermedia.top();intermedia.pop();intermedia.push(op1 | op2);break; default: break;} } //栈中的最后一个元素就是计算结果 result = intermedia.top(); intermedia.pop();}string CalSuffix::GetSuffix(){ return suffix;}bool CalSuffix::GetResult(){ return result;}
测试代码也贴上:
#include <iostream>#include <string>#include "calsuffix.h"using namespace std;int main(){ string expression; cout << "Input infix expression: " << endl; cin >> expression; CalSuffix cal(expression); cal.InfixToSuffix(); cout << "Suffix expression is: \n" << cal.GetSuffix() << endl; cal.Calculate(); cout << "The result is: \n" << cal.GetResult() << endl; return 0;}
就这样吧!我记得当年我们做课程设计的时候好像也有这么一道题,不过我没选。自己选的什么也记不得了。
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀表达式并求值
- 中缀表达式转后缀并求值
- 中缀表达式变后缀表达式并求值
- 中缀表达式求值、后缀表达式求值、中缀转后缀、前缀
- C语言 实现中缀表达式转后缀表达式并求值
- C++实现中缀表达式转后缀表达式并求值
- 中缀 后缀表达式求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式求值
- 中缀表达式转后缀表达式 求值
- 中缀转后缀 和 后缀表达式求值
- NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】
- 表达式求值(中缀转后缀及后缀表达式求值)
- C语言中缀表达式转后缀表达式并利用后缀表达式求值 (小于10)
- 中缀表达式转后缀表达式 以及 后缀表达式求值
- css中的一些技巧
- 转:VS2008内存泄露检测
- javaScripte--Oriented Object(two)
- 1_使用yum 安装mysql php httpd
- android目录下的各文件作用
- 中缀表达式转后缀表达式并求值
- zigbee(选型)
- jquery widgets 开发
- Magento得到当前页面的URL,得到当前产品页面的URL
- epoll精髓
- Doubango
- 线程学习三
- poj2379
- AVR单片机(ATMEGA16)控制蜂鸣器