数据结构-栈和队列

栈和队列

栈和队列都是线性数据结构,逻辑结构和线性表相同。

栈和队列的插入和删除操作受到某些限制,与线性表不同,也被称为操作受限的线性表。

栈是一种插入和删除都只能在表的同一端操作的线性表。

允许进行插入和删除操作的一端叫栈顶(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=
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值