运用栈stack类实现简单计算器(即表达式求值) 您所在的位置:网站首页 计算器别名 运用栈stack类实现简单计算器(即表达式求值)

运用栈stack类实现简单计算器(即表达式求值)

2024-07-15 18:21| 来源: 网络整理| 查看: 265

一、主要目的

1、掌握类的声明与实现的规范写法;

2、设计并实现栈stack类;

3、掌握多文件项目的结构;

4、运用栈stack类实现简单计算器(即表达式求值)。

二、运行原理:

1. 输入一个中缀表达式,首先将表达式的字符进行遍历,如果遇到的字符是数字,就直接压入操作数栈,如果遇到的字符是运算符,就判断其与操作符栈顶元素的优先级。 

2. 如果输入的运算符优先级高于栈顶运算符优先级,就将其压入操作符栈。如果输入的运算符优先级低于或等于栈顶运算符优先级,就将栈顶运算符pop出,并从操作数栈中pop出两个元素进行运算,将运算结果再次压入操作数栈,直到操作符栈顶运算符的优先级低于输入的运算符,然后再将输入的运算符压入操作符栈。 

3. 如果遇到的字符是'#',就将操作符栈中的所有运算符pop出,并从操作数栈中pop出相应数量的元素进行运算,直到操作符栈为空。这时操作数栈中只有一个元素,即为表达式的计算结果。

4. 过程中,如果遇到无法进行的运算或者表达式格式错误,会直接输出错误信息并退出程序。

三、代码实现

#include

#include"stack.h"

using namespace std;

const int n=5;

char op[n]={'+','-','*','/','#'};

int prior[n][n]={{2,2,1,1,2},

                 {2,2,1,1,2},

                 {2,2,2,2,2},

                            {2,2,2,2,2},

                            {1,1,1,1,3}};

int getIndex(char c)

{

      for(int i=0;i

             if(*p>=48 && *p

                 optr.push(*p++);      

             }

             else if(prior[getIndex(optr.gettop())][getIndex(*p)]==2)

             {

                    optr.pop(&op);

                    opnd.pop(&num2);

                    opnd.pop(&num1);

                    if(op=='+')

                    {

                           opnd.push(num1+num2-48);

                    }

                    else if(op=='-')

                    {

                           opnd.push(num1-num2+48);

                    }

                    else if(op=='*')

                    {

                           opnd.push((num1-48)*(num2-48)+48);

                    }

                    else

                    {

                           opnd.push((num1-48)/(num2-48)+48);

                    }

             }

             else if(prior[getIndex(optr.gettop())][getIndex(*p)]==3)

             {

                    return opnd.gettop()-48;

             }

             else

             {

                    cout

      top=base=new char[size];

}

stack ::~stack()

{

    delete[] base;

}

int stack::isempty()

{

      return top == base?1:0;

}

int stack::push(char c)

{

      if (length()==size)

      {

             cout

             cout

             cout

     

      for (char*p=top-1; p >base; p--)

             {

             cout

public:

      stack();

      ~stack();

      void clearstack();       //清空

      int isempty();                    //判空

      int length();                //求长度

      char gettop();                    //取栈顶元素

      int push(char);                  //进栈

      int pop(char*);                  //出栈

      void traverse();                 //遍历

protected:

      char *base;                        //栈底指针

      char *top;     //栈顶指针

      static int size;

};

四、结果展现

五、总结: 以上给出的代码是一个栈计算器的实现。用户输入一个以'#'开头和结尾的中缀表达式,计算器会将其转换成后缀表达式并计算出结果。在代码中实现了栈的基本操作,包括初始化、入栈、出栈、取栈顶元素、清空栈、判断栈是否为空、获取栈的长度以及遍历栈。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有