实现一个简单计算器,表达式为字符串表示

来源:互联网 发布:主宰西游淘宝 编辑:程序博客网 时间: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();}

运行结果

原创粉丝点击