实现一个简单计算器,表达式为字符串表示
来源:互联网 发布:主宰西游淘宝 编辑:程序博客网 时间:2024/06/11 09:30
实现一个简单计算器,表达式为字符串表示
- 要求:
- 实现一个简单计算器,表达式是字符串,如“#(2*(1+3)+8)/4#”,以‘#’做标志位
如:
输入
#(2*(1+3)+8)/4#
输出
4
实现思路:
- 用栈实现。将输入的中缀表达式通过栈的方式改为后缀表达式计算。
- 如
(2*(1+3)+8)/4
可先将“(”压入栈1,“2”压入栈2,“*”继续压入栈1,“(”压入栈1,“1”压入栈2,“+”压入栈1,“3”栈2。
这时,遇到“)”
此时
栈1:(*(+
栈2:2 1 3
将栈1的“+”“(”,栈2的“3”“1”抛出计算“1+3”,将值“4”压入栈2,
此时:
栈1:(*
栈2:2 4
…….
以下是实现代码:
//栈的头文件#ifndef STACK1_H#define STACK1_H#include <iostream>#include <string>using namespace std;const int maxlen = 100;template <typename elementType>class Stack1{public: Stack1(); ~Stack1(){}; void push(elementType x);//入栈 void get_top(elementType &x);//出栈 void pop(); bool empty();//判空 bool full();//判满 friend istream &operator>>(istream &cin, Stack1<string> &s2);// 重载函数private: int count; elementType data[maxlen]; string t;};#endif
//栈的源文件#include "Stack1.h"#include <iostream>template <typename elementType>Stack1<elementType>::Stack1(){ count = 0;}template <typename elementType>bool Stack1<elementType>::empty()//判空{ if (0 == count) { return true; } return false;}template <typename elementType>bool Stack1<elementType>::full()//判满{ if (maxlen==count) { return true; } return false;}template <typename elementType>void Stack1<elementType>::push(elementType x)//入栈{ if (!full()) { data[count++] = x; }}template <typename elementType>void Stack1<elementType>::get_top(elementType &x)//出栈{ if (!empty()) { x = data[count - 1]; }}template <typename elementType>void Stack1<elementType>::pop(){ if (!empty()) { --count; }}template <typename elementType>istream & operator>>(istream &cin, Stack1<string> &s2){ cin >> s2.t; return cin;}
//主函数#include "Stack1.cpp"using namespace std;//判断是否是数字bool isnum(char x){ if (x>='0'&&x<='9') { return true; } return false;}//判断优先级int priority(char x){ if (x=='+'||x=='-') { return 0; } else if (x == '*' || x == '/') { return 1; } else if (x == '(' || x == ')') { return -1; } else if (x=='#') { return -2; }}//计算int calca(string s){ Stack1<int> num; Stack1<char> ope; char top; int a, b; for (int i = 0; i < s.size();i++) { if (isnum(s[i])) { int Temp = 0; string temp; temp += s[i]; while (isnum(s[++i])) { temp += s[i]; } for (int j = 0; j < temp.size(); j++) { Temp = Temp * 10 + temp[j] - 48; } num.push(Temp); temp.clear(); }//将字符数转换成整形 if (!isnum(s[i])) { if (ope.empty()) { ope.push(s[i]); } else { ope.get_top(top); if ((s[i] == '(')) { ope.push(s[i]); } else if (priority(s[i])>priority(top)) { ope.push(s[i]); } else { while (priority(s[i]) <= priority(top)) { if (top=='#'&&s[i]=='#') { int answer; ope.pop(); num.get_top(answer); cout << "\n答案是:" << answer << endl; num.pop(); return 0; } if (top=='('&&s[i]==')') { ++i; } if (s[i] == ')') { num.get_top(a); num.pop(); num.get_top(b); num.pop(); } else if (priority(s[i]) <= priority(top)) { num.get_top(a); num.pop(); num.get_top(b); num.pop(); } if (top=='+') { b += a; num.push(b); } else if (top == '-') { b -= a; num.push(b); } else if (top == '*') { b *= a; num.push(b); } else if (top == '/') { b /= a; num.push(b); } ope.pop(); ope.get_top(top); } ope.push(s[i]);//用于当top=='#'时,将最后一个运算符入栈 } } } }}int main(){ string s1; cout << "输入一个以'#'开头结尾的表达式:" << endl; cin >> s1; calca(s1); cin.get(), cin.get();}
阅读全文
0 0
- 实现一个简单计算器,表达式为字符串表示
- 一个简单计算器【解析表达式】
- 实现一个简单的计算器
- 计算一个字符串表示的四则运算表达式
- 一个简单的计算器界面实现
- 一个简单的Java计算器实现
- 一个能够实现简单功能的计算器
- 用javascript实现一个简单计算器
- C语言实现一个简单的计算器
- jsp实现一个简单的计算器
- 用JSP实现一个简单的计算器
- MFC实现一个简单的计算器
- QT实现一个简单的计算器
- QT实现一个简单的计算器
- javaScript简单实例:实现一个简易计算器
- HTML&&JavaScript实现一个简单的计算器
- 三十行代码实现一个简单计算器
- 类实现一个简单的日期计算器
- Rotation Matrix To Euler Angles
- poj 2386(深搜或广搜)
- 四元数(Quaternion)和旋转
- 面试题-2017/6/19
- CG在vs中配置方法
- 实现一个简单计算器,表达式为字符串表示
- 点击li弹出对应的index
- Spring MVC工作流程详解
- mybatis学习之添加新用户例子
- URAL
- 初识Python
- android事件分发
- HDU 3746 Cyclic Nacklace KMP求字符串最小循环节长度
- Android View触摸事件传递机制 一