利用栈计算表达式的值

来源:互联网 发布: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
原创粉丝点击