利用栈计算表达式的值
来源:互联网 发布:dota视频站软件 编辑:程序博客网 时间:2024/06/09 19:53
题目:带+-*/()的表达式计算。如:(1+2*3)-4;
思想:两个栈,一个用来存放数字,一个用来存放符号,然后比较各个符号优先级,遇到每个符号怎么解决等,考虑要全面。
栈的基本操作:
#ifndef _STACK_H_#define _STACK_H_template <typename T>class myStack{public: myStack(int maxSize = 100); ~myStack(); void Push(const T x); void Pop(); T& getTop(); bool isEmpty();private: T *s_; int top_; int maxSize_;};template <typename T>myStack<T>::myStack(int maxSize) : top_(-1),maxSize_(maxSize){ s_ = new T[maxSize_];}template <typename T>myStack<T>::~myStack(){ delete [] s_;}template <typename T>void myStack<T>::Push(const T x){ if(this->top_ == maxSize_-1) { throw(1); } ++top_; s_[top_] = x;}template <typename T>void myStack<T>::Pop(){ if(isEmpty() == true) { throw(1); } --(this->top_);}template <typename T>T & myStack<T>::getTop(){ if(isEmpty() == true) { throw(1); } return s_[top_];}template <typename T>bool myStack<T>::isEmpty(){ return top_ == -1;}#endif
计算的类
#ifndef _CALCULATE_H_#define _CALCULATE_H_#include <iostream>#include <string>#include "stack.h"using namespace std;int my_atoi(char ch){ if(ch >= '0' && ch <= '9') { return ch-'0'; } return -1;}class calculate{public: calculate(); ~calculate(); void Scan(char *temp); int getNum(); int bijiao(char c); int cal(int n, int m, char c); private: myStack<int> n_; myStack<char> o_;};calculate::calculate() : n_(100),o_(100){ }calculate::~calculate(){}int calculate::getNum(){ return n_.getTop();}int calculate::bijiao(char c)//优先级比较{ if(c == '*' || c == '/') { return 3; } else if(c == '+' || c == '-') { return 2; } else if(c == '(') { return 1; } else if(c == '\0') { return 0; } else { return 0; }}int calculate::cal(int n,int m, char c)//计算{ if(c == '+') return n+m; if(c == '-') return n-m; if(c == '*') return n*m; if(c == '/') return n/m;}void calculate::Scan(char *temp){/* char temp[100]; int i = 0; cout << "plseae input a expression: " << endl; cin >> temp; cout << temp << endl; cout << strlen(temp) << endl;*/ int i = 0; /*cout << "1"<< endl; for(int j = 0; j < 7; j++) { cout << temp[j] <<endl; }*/ int num1; int num2; int result; while(1) { if(temp[i] == '\0'){ while(o_.isEmpty() != true) { num1 = n_.getTop(); n_.Pop(); num2 = n_.getTop(); n_.Pop(); result = cal(num2,num1,o_.getTop()); o_.Pop(); n_.Push(result);//i涓嶅鍔? //break; } break; } switch(temp[i]) { case '(': { o_.Push(temp[i]);i++; break; } case ')': { while(o_.getTop() != '(') { num1 = n_.getTop(); n_.Pop(); num2 = n_.getTop(); n_.Pop(); result = cal(num2,num1,o_.getTop()); o_.Pop(); n_.Push(result);//i涓嶅鍔? } ++i;//鎶?)'鎵斾簡 o_.Pop();//鎶?('鎵斾簡 break; } case '-': case '+': { if(o_.isEmpty() == true) { o_.Push(temp[i]); i++; break; } if(bijiao(temp[i]) <= bijiao(o_.getTop())) { num1 = n_.getTop(); n_.Pop(); num2 = n_.getTop(); n_.Pop(); result = cal(num2,num1,o_.getTop()); o_.Pop(); n_.Push(result);//i涓嶅鍔? } else { o_.Push(temp[i]); i++; } break; } case '*': { o_.Push(temp[i]);i++; break; } case '/': { o_.Push(temp[i]);i++; break; } default: { int num = 0; while(temp[i] >= '0' && temp[i] <= '9') { //cout << temp[i] << endl; num = num *10 + my_atoi(temp[i]);//注意系统的atoi用法,它是将比如15直接转为数字,不是一个1转化一个5转化 //所以自己写的my_atoi(),一个个转化。 ++i; } n_.Push(num); break; } }/*if(temp[i] == '\0'){ break;}*/ }}#endif
主程序:
#include <iostream>//#include "stack.h"#include "calculate.h"using namespace std;int main(){ /* myStack<int> s(100); myStack<char> o(100); for(int i = 0 ; i < 5; ++i) { s.Push(i+1); } for(int i = 0 ; i < 5; ++i) { cout << s.getTop() << endl;s.Pop(); } */ char s[100]; memset(s,0,sizeof(s));cout << "plseae input exp: " <<endl; cin >> s; //cout << s << endl; cout << strlen(s) << endl;; calculate ca; ca.Scan(s); cout << ca.getResult() << endl; return 0;}
0 0
- 利用栈计算表达式的值
- 利用栈计算算数表达式的值
- 利用栈计算表达式的值
- 利用正则表达式计算表达式的值
- 利用栈的原理计算一个表达式的值
- 利用栈结构计算代数表达式的值
- 利用栈计算表达式的值 By Assassin
- 利用正则式计算表达式的值
- 利用双栈计算表达式
- 完全利用栈实现表达式的计算问题
- 用数组创建一个栈(stack),并利用栈来计算后缀表达式的值
- 栈的应用:通过用户输入后缀表达式,利用数据结构栈计算其结果值。
- 利用API 实现字符串表达式的计算
- 利用API 实现字符串表达式的计算
- 栈(一)利用栈计算表达式
- 数据结构中利用栈计算算术表达式
- 利用栈结构计算表达式串算法
- 利用栈来实现计算表达式的自动计算(二)
- 多线程之内存可见性Volatile(一)
- Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?
- JAVA中覆盖与重载
- MaxCompute Optimizer之表达式约化
- 决策树python
- 利用栈计算表达式的值
- 用Fiddler或Charles进行mock数据搭建测试环境
- 用Word 写csdn博客
- vector中的resize()和reserve()
- SQL语句练习
- android群英传笔记 android apk应用信息获取
- iOS NSTimer 子线程 创建与取消
- dos 小命令
- MaxCompute 中的Code Generation技术简介