栈和队列的概念

前言:栈和队列是常用的两种数据结构,他的逻辑结构和线性表相同,也属于线性结构。 不同之处在于,栈和队列的操作具有特殊性,他们只是线性表相关操作的一个子集。 更准确的说,一般线性表的插入和删除操作是不受限制的,而栈和队列上的插入和删除均受某种特殊限制。栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表的另一端进行,所以,把栈和队列称为操作受限的线性表

一.栈:

现实生活中的事情往往能总结归纳成一定的数据结构,如餐馆中餐盘的堆叠和使用,羽毛球桶里装的羽毛球等都是典型的栈。 栈(Stack)是操作限定在表的尾端进行的线性表,对其他位置不能进行操作。 栈数据的主要特点是后进先出(Last In First Out,简称LIFO)或先进后出(First In Last Out,简称FILO) S= (a1,a2,…,an),S是英文单词stack的第 1 个字母。a1为栈底元素,an为栈顶元素。这n个数据元素按照a1,a2,…,an的顺序依次入栈,而出栈的次序相反,an第一个出栈,a1最后一个出栈。

1.栈-基本概念

栈顶(Top):表尾,栈中允许数据插入和删除的那一端。 栈底(Bottom):表头,栈中无法进行数据操作的那一端。 栈上溢(Full):栈内空间已满时,仍进行入栈操作,是一种空间不足的出错状态。 栈下溢(Empty):栈内无数据时,仍然进行出栈操作,是一种数据不足的出错状态。 进栈或者入栈(Push):将数据插入栈顶部。 弹出或出栈(Pop):取出并删除栈顶部的数据。

2.栈-常用方法

Push()入栈(添加数据) Pop()出栈(删除数据,返回被删除的数据) Peek()取得栈顶的数据,不删除 Clear()清空所有数据 Count取得栈中数据的个数

3.栈-接口

public interface IStack<T> {
     int Count{get;}//元素个数
int GetLength(); 
bool IsEmpty(); //是否为空栈
void Clear(); //清空
void Push(T item); //入栈操作
T Pop(); //返回栈顶数据并且出栈
T Peek(); //取栈顶元素,不出栈
}

4.栈-分类

①顺序栈,即栈的顺序存储结构(数组),是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。当top=-1时候,表示为空栈。 由于顺序栈的操作位置基本在栈顶,所以,不需要查找插入和删除的位置,也不需要移动元素,因而顺序栈的基本操作要比顺序表简单的多,其基本操作时间复杂度均为O(1)

链栈,栈的另外一种存储方式是链式存储,这样的栈称为链栈(Linked Stack)。 链栈通常用单链表来表示,它的实现是单链表的简化。 由于链栈的操作只是在一端进行,为了操作方便,把栈顶设在链表的头部。 单链表获取长度需要遍历整个链表,性能很低,所以我们增加一个count属性记录元素个数。

③双向栈是两个栈高效共享同一数组空间的简捷方法,他是将两个栈的栈底设在数组空间的两端,两个栈顶指针分别向中间移动,即数据压入左栈时,左栈的栈顶指针+1,数据压入右栈时,右栈的栈顶指针-1,如下图:这样左右两个栈可以互相调节空间,逻辑上可以使用整个数组空间,只有在整个数组空间被两个栈占满时才会发生上溢,这样产生上溢出的概率会比两个独立设置时小的多。

 

二.队列

1.队列-基本概念

队头( Front):队列中允许数据删除的那一端。 队尾( Rear):队列中允许数据插入的那一端。 队上溢(Full):存储空间已满,仍希望入队操作,会产生上溢出,是一种空间不足的出错状态。 队下溢(Empty):队内空间无数据,仍希望出队操作,会产生下溢出,是一种数据不足的出错状态。 空队列(Empty Queue):队列中没有数据元素. 入队(Enqueue):将一个数据插入到队尾的操作。 出队(Dequeue):读取队头节点并删除该节点的操作

2.队列-常用方法

Queue<T>类 Enqueue()入队(放在队尾) Dequeue()出队(移除队首元素,并返回被移除的元素) Peek()取得队首的元素,不移除 Clear()清空元素 Count获取队列中元素的个数

3.队列-接口

public interface IQueue<T> {
    int Count{get;}//获取元素个数
int GetLength(); 
bool IsEmpty(); //是否为空队列
void Clear(); //清空队列
void Enqueue(T item); //入队
T Dequque(); //出队
T Peek(); //取队头元素
}

4.队列-分类

①顺序队列,顺序队列(Sequence Queue)用一片连续的存储空间来存储队列中的数据元素. 用一维数组来存放顺序队列中的数据元素。 队头位置设在数组下标为 0 的端,用 front 表示; 队尾位置设在数组的另一端,用 rear 表示。  front 和 rear 随着插入和删除而变化。 当队列为空时, front=rear=0。 因为在出队列(删除元素)的时候,需要花费大量 的时间移动大量元素,速度很慢,所以很少有实际应用

②循环顺序队列,为了避免大量数据的移动,通常将一维数组的各个元素看成一个收尾相接的封闭的圆环,即第一个元素是最后一个元素的下一个元素,这种形式的顺序队列成为循环顺序队列(Circular sequence Queue)。 C#为我们提供的Queue类就是循环队列。

链队列,队列的另外一种存储方式是链式存储,这样的队列称为链队列(Linked Queue)。 同链栈一样,链队列通常用单链表来表示,它的实现是单链表的简化。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值