实验内容
(1)根据计算器的原理设计一个具有加、减、乘、除、括号等功能的简易计算器。
(2)能通过键盘输入需要计算的表达式,并实现简单算术运算,能将运算结果输出显示。
(3)能够实现混合运算的算术表达式求解,算术表达式中包括加、减、乘、除、括号等操作符;并且能够识别括号,优先级正确。
实验平台
通过高级程序设计语言(C++)实现计算器功能。
相关知识
①队列(queue):一种可以实现“先进先出”的线性存储结构。
头文件:
#include<queue>
定义:
queue<double>q1; //保存操作数
queue<char>q2; //保存操作符
基本操作:
queue入队,例:q.push(x);将x 接到队列的末端;
queue出队,例:q.pop();弹出队列的第一个元素,注意,并不会返回被弹出元素的值;
访问queue队首元素,例:q.front(),即最早被压入队列的元素;
访问queue队尾元素,例:q.back(),即最后被压入队列的元素;
判断queue队列空,例:q.empty(),当队列空时,返回true;
②栈(stack):一种可以实现“先进后出”的线性存储结构。
头文件:
#include<stack>
定义:
stack<double>s1; //保存操作数
stack<char>s2; //保存去掉括号的操作符
基本操作:
s.push(item); //将item压入栈顶
s.pop(); //删除栈顶的元素,但不会返回
s.top(); //返回栈顶的元素,但不会删除
s.size(); //返回栈中元素的个数
s.empty(); //检查栈是否为空,如果为空返回true,否则返回false
具体步骤
一、定义两个队列分别保存表达式中的操作数和操作符
(1)如果X是操作数,入队q1;
(2)如果X是操作符,入队q2。
二、双栈去括号及优先级算法
(1)将队列q1中的操作数直接压栈s1
(2)将队列q2中的操作符:
如果这个操作符比s2栈顶操作符的优先级高,则压栈;
如果这个操作符比s2栈顶操作符的优先级低,则从s1栈中弹出两个操作数,从s2中弹出栈顶操作符进行运算,并将运算结果压栈s1。
(3)直到队列q2中的元素没有为止。
三、计算表达式
将栈s2中的元素逐个出栈,栈s1的栈顶元素和队列q1的第一个元素进行四则运算,并将结果保存到队列q1的第一个元素中。