运用栈stack类实现简单计算器(即表达式求值) | 您所在的位置:网站首页 › 计算器别名 › 运用栈stack类实现简单计算器(即表达式求值) |
一、主要目的
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 实验室设备网 版权所有 |