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

原创 2017年06月19日 20:14:22

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

  • 要求:
  • 实现一个简单计算器,表达式是字符串,如“#(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();
}

运行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

计算器(输入字符串解析运算)

  • 2013年10月21日 15:43
  • 45KB
  • 下载

【经典算法】:用字符串模拟计算器的生成

前言一般的制作计算器都会比较不智能,会有很严格的输入格式 在这里,我做了一个简化,使的即使没有严格地输入输出格式,也能够达到计算器的效果比如说:下面这些例子 这里就是用字符串读入了一行,然后对字符...
  • qq_23100787
  • qq_23100787
  • 2015年09月29日 17:44
  • 585

如何在C#中运行数学表达式字符串

如何在C#中运行数学表达式字符串
  • tigerzx
  • tigerzx
  • 2017年03月06日 17:23
  • 118

c++ 实现数学表达式解析

实现数学表达式解析解析 支持 带括号 数学运算, 支持 数学函数。
  • tiankong_bear
  • tiankong_bear
  • 2016年10月30日 14:40
  • 2151

杭电ACM1237——简单计算器

简单的表达式求值,A了好久,坑。 AC的代码: #include #include #include #include using namespace std; int main() {...
  • qq_25425023
  • qq_25425023
  • 2015年05月06日 22:49
  • 896

19:简单计算器

原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况,数据和运算结果不...
  • mayuan2017
  • mayuan2017
  • 2017年09月02日 13:46
  • 596

java执行字符串数学表达式 ScriptEngine

今天遇到了一个需要将数据库中保存的表达式,替换其中的字符,并计算出值,java是不能直接计算的例如:  Java代码   double d = (3+5-(2-4)*2...
  • w1014074794
  • w1014074794
  • 2015年05月25日 13:25
  • 2441

string数学表达式处理

优化一下上次写的代码,加上了注释,加强了可读性和封装性 #include "reverse_polish.h" void reverse_polish() { string st; cout ...
  • qq_37244872
  • qq_37244872
  • 2018年02月09日 16:14
  • 0

编译器--简单数学表达式计算器(一)

做了一个能够计算简单数学表达式值的小计算器,算不上是编译器,但用到了编译器的知识。最近在看一些编译器的东西,所以动手写这个最简单的计算器,既是对那些抽象的编译器知识有个形象的认识,也为后面添加复杂的东...
  • luo3532869
  • luo3532869
  • 2014年10月12日 16:49
  • 3279

给定一个表示分数加减表达式的字符串,需要以字符串格式返回计算结果。结果表达式也是分数式

本题源自leetcode  592 ----------------------------------------------------------------- 思路: 1 求分数表达式,用...
  • i_am_bird
  • i_am_bird
  • 2017年12月03日 11:17
  • 78
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现一个简单计算器,表达式为字符串表示
举报原因:
原因补充:

(最多只允许输入30个字)