实验四 堆栈的应用
一、 要求完成时间
实验开始后的第五周之前完成
二、 实验目的
掌握堆栈的使用。
三、 实验内容
1、 输入一个数学表达式(假定表达式输入格式合法),计算表达式结果并输出。
2、 数学表达式由单个数字和运算符“+”、“-”、“*”、“/”、“(、) ”构成,例如 2 + 3 * ( 4 + 5 ) - 6 / 4。
3、 变量、输出采用整数,只舍不入。
四、 输入输出请严格按下面要求的格式实现
分析:
1.将输入的字符串拆分,分别将数据与操作符放到两个堆栈里。
2.定义操作符的优先级别,当一个操作符要入栈时先判断栈顶的操作符的优先级是不是比它大,意思就是当准备入+或-时,可以计算栈里的*或/了。
3.当遇到)时要将栈里的操作符拿出进行运算,直到遇到(,表示括号处理完毕。
4.当最后一个操作符处理完后,还要将栈内剩余的操作符都处理了,因为此时剩下的都是同级的+-或*/。
5.注意:对*/操作好说,但是对于+-运算,由于我采用的是从后往前计算,所以-a-b = -(a+b)和 -a+b = -(a-b) ,就是+-需要根据前面的符号判断是否需要变号。
6.对于负数的处理,如果将-看成是操作符会导致计算结果错误,因为每个操作符对应两个操作数,会不匹配的。我是这么处理的:-1 = 0-1,将它补充成正常的整数计算。
以下是代码,有点略多,仅供参考,希望你写出更好的法!
代码:
//自定义链表形式的堆栈
#include<iostream>
#include<string>
using namespace std;
template<class T>
class Node{
public:
T data;
Node<T> *link;
};
template<class T>
class LinkedStack{
public:
LinkedStack(){topNode=0;}
~LinkedStack();
bool IsEmpty()const{return topNode==0;}
bool IsFull()const;
T Top()const;
LinkedStack<T>& PushStack(const T&x);
LinkedStack<T>& PopStack(T&x);
LinkedStack<T>& PopStack();
Node<T> *topNode;
void Show()const;
int Size()const;
};
//处理数组越界的报错
class OutOfBounds{
public:
OutOfBounds(){
cout<<"Out Of Bounds!"<<endl;
}
};
//内存不足的异常类
class NoMem{
public:
NoMem(){
cout<<"No Memory!"<<endl;