栈和队列
栈和队列都是线性数据结构,逻辑结构和线性表相同。
栈和队列的插入和删除操作受到某些限制,与线性表不同,也被称为操作受限的线性表。
栈
栈是一种插入和删除都只能在表的同一端操作的线性表。
允许进行插入和删除操作的一端叫栈顶(Top),也叫表尾;另一端叫做栈底(Bottom),也叫表头。
栈中没有元素时称为空栈。
向栈中插入元素的操作称为进栈或入栈(push),从栈中删除元素的操作称为退栈或出栈(pop)。
栈是按照先进后出(FILO,First In Last Out)或后进先出(LIFO,Last In First Out)的原则组织数据。
创建一个空栈;删除一个栈;判断栈是否为空;判断栈是否为满;栈顶插入一个元素;求栈顶元素的值;删除栈顶的一个元素;输出栈。
栈的抽象数据类型
采用顺序存储结构表示的栈称为顺序栈。
顺序栈需要分配一块连续的存储区域来存放栈中的元素。
顺序栈可以用一维数组实现。
栈底位置固定不变,可以吧栈底设置在一维数组任意一端。
栈顶位置随着进栈和出栈操作不断变化,因此用一个变量来指示当前栈顶位置。
顺序栈类模板:栈中最大元素个数为MaxSize,顺序类模板名称LinearStack
#include <iostream>
using namespace std;
template<class T>
class LinearStack
{
public:
LinearStack(int LSMaxSize); //构造函数,创建空栈
~LinearStack(); //析构函数,删除栈
bool IsEmpty(); //栈空返回true,非空返回false
bool IsFull(); //栈满返回true,不满返回false
int GetElementNumber(); //求栈中元素的个数
bool Push(const T& x); //在栈顶插入元素x,成功返回true,失败返回false
bool Top(T& x); //求栈顶元素的值放入x,成功返回true,失败返回false
bool Pop(T& x); //从栈顶删除一个元素,并将该元素的值放入x中
void OutPut(ostream& out)const; //将顺序栈放到输出流out中输出
private:
int top; //用来表示栈顶
int MaxSize; //栈中最大元素个数
T *element; //一维动态数组
};
将栈顶top赋值为-1,表示空栈。
当栈中已有MaxSize个元素,如果再进行进栈操作,就会产生溢出,称为上溢;对空栈进行出栈操作时也会产生溢出,称为下溢。
进行进栈出栈操作时,应先检查栈是否为满(IsFull)或是否为空(IsEmpty);
IsEmpty()的算法是:return top==-1;
IsFull()的算法是:return top+1=MaxSize;
求栈中元素的个数GetElementNumber()的算法:return top+1;
进栈操作Push(const T& x)的算法:
//向栈顶插入一个元素x
if(IsFull())
return false;
else
{
top++;
element[top]=x;
return true;
}
Pop(T& x)出栈操作算法:
if(IsEmpty())
return false;
else
{
x=element[top];
top--;
return true;
}
//实现构造函数
template<class T>
LinearStack<T>::LinearStack(int LSMaxSize)
{
MaxSize=