数据结构第三章栈和队列
- 格式:pdf
- 大小:812.75 KB
- 文档页数:82
第三章堆栈和队列Chapter 3 Stack and Queue2/743.1 堆栈(Stack )3.2 队列(Queue )1. 定义2. 逻辑结构3. 存储结构4. 运算规则5. 实现方式 1. 定义2. 逻辑结构3. 存储结构4. 运算规则5. 实现方式本章内容3/743.1 堆栈一、堆栈的基本概念•定义堆栈是限定只能在表的一端进行插入和删除的线性表。
在表中允许插入和删除的一端叫做栈顶(top);表的另一端则叫做栈底(base)。
出栈或退栈入栈或进栈a 0a 1…a n-2a n-1basetop Last In First Out4/74一般线性表逻辑结构:一对一存储结构:顺序表、链表运算规则:随机存取堆栈逻辑结构:一对一存储结构:顺序栈、链栈运算规则:后进先出(LIFO)*堆栈与一般线性表的比较*5/74例一个栈的输入序列为123,若在入栈的过程中允许出栈,则可能得到的出栈序列是什么?答:可以通过穷举所有可能性来求解:①1入1出,2入2出,3入3出,即123;②1入1出,2、3入,3、2出,即132;③1、2入,2出,3入3出,1出即231;④1、2入,2、1出,3入3出,即213;⑤1、2、3入,3、2、1出,即321;合计有5种可能性。
* 不可能产生的输出序列:3126/741、初始化2、进栈3、退栈4、取栈顶元素5、判栈是否非空二、堆栈的操作7/74三、栈的顺序表示和实现——顺序堆栈1. 顺序栈的存储结构出栈或退栈入栈或进栈basetopa 0a 1a 3a 4a 5maxlen-15432108/74顺序栈的定义typedef int DataType;#define maxlen 100 /*顺序堆栈数组最大存储单元个数*/typedef struct /*顺序栈定义*/{ DataType stack[maxlen];/*顺序堆栈存放数据元素的数组*/int top; /*顺序堆栈的当前栈顶位置*/} seqstack;/*结构类型名*/9/742. 顺序堆栈的操作实现toptop a 0a 1a 2topmaxlen个空栈0a 12进栈出栈top 10/74•初始化参数:S 是指向结构变量的指针;功能:建一个空栈S;void inistack(seqstack *s){s->top=-1;}/*顺序堆栈数组的当前栈顶位置*/11/74•判栈空操作参数:S 是存放结构体变量的数组;功能:判断S是否为空,为空返回1,否则返回0;int empty(seqstack s){if(s.top==-1)return 1;elsereturn 0;}12/74•入栈功能:将数据元素x压入顺序堆栈S,入栈成功返回1,否则返回0int push(seqstack *s, DataType x){if (s->top==maxlen-1){ printf(“\nStack is full ”);return 0;}s->top++;s->stack[s->top]=x;return 1;}判栈满?栈顶下标加1入栈s->stack[++s->top]=x;13/74•出栈功能:弹出顺序堆栈s的栈顶数据元素值到参数d,出栈成功返回1,否则返回0判栈空?元素出栈栈顶下标减1else{ *d= s->stack[s->top];(s->top)--; return 1; }}int pop(seqstack *s,DataType *d){ if(s->top==-1){ printf("\n Stack is empty!");return 0; }*d=s->stack[s->top--];14/74•取栈顶元素功能:取顺序堆栈s的当前栈顶数据元素值到参数d,成功返回1,否则返回0int gettop(seqstack s,DataType *d){if(s.top==-1){ printf(“\nStack is empty!”);return 0;}else{ *d=s.stack[s.top];return 1;}}16/74两个堆栈共享空间目的:节省空间扩展知识——堆栈共用问题两个堆栈共享空间的运算:初始化进栈出栈a 0…a i a j …a m0maxlen-1LeftTopRightTop…17/74数据结构定义:typedef struct{ DataType stack[maxlen];int LeftTop;int RightTop;} dqstack;18/74初始化算法void InitiDqstack(dqstack*s);{s->LeftTop=-1;s->RightTop=maxlen;}19/74int PushDqstack(dqstack*s,char WhichStack,DataType x){if (s->LeftTop>= s->RightTop-1){printf(“栈满”);return 0;}if (WhichStack!=‘L ’&& WhichStack !=‘R ’){printf(“出错”);return 0;}if (WhichStack==‘L ’) s->stack[++s->LeftTop]=x;else s->stack[--s->RightTop]=x;return 1;}进栈算法判断是否栈满判断输入是否错X入左栈X入右栈20/74共用堆栈的出栈算法:自编。
数据结构第三章数据结构堆栈和队列数据结构第三章数据结构堆栈和队列3.1 堆栈堆栈(Stack)是一种遵循后进先出(Last In First Out,LIFO)原则的线性数据结构。
堆栈中只有一个入口,即栈顶,所有的插入和删除操作都在栈顶进行。
3.1.1 堆栈的基本操作- Push:将元素插入到栈顶- Pop:从栈顶删除一个元素- Top:获取栈顶元素的值- IsEmpty:判断栈是否为空- IsFull:判断栈是否已满3.1.2 堆栈的实现堆栈可以使用数组或链表来实现。
- 基于数组的堆栈实现:使用一个数组和一个指针来表示堆栈,指针指向栈顶元素的位置。
Push操作时,将元素插入到指针指向的位置,然后将指针向上移动;Pop操作时,将指针指向的元素弹出,然后将指针向下移动。
- 基于链表的堆栈实现:使用一个链表来表示堆栈,链表的头结点表示栈顶元素。
Push操作时,创建一个新节点并将其插入链表的头部;Pop操作时,删除链表的头结点。
3.1.3 堆栈的应用堆栈广泛应用于各种场景,如函数调用栈、表达式求值、括号匹配等。
3.2 队列队列(Queue)是一种遵循先进先出(First In First Out,FIFO)原则的线性数据结构。
队列有两个端点,一个是入队的端点(队尾),一个是出队的端点(队首)。
3.2.1 队列的基本操作- Enqueue:将元素插入到队尾- Dequeue:从队首删除一个元素- Front:获取队首元素的值- Rear:获取队尾元素的值- IsEmpty:判断队列是否为空- IsFull:判断队列是否已满3.2.2 队列的实现队列可以使用数组或链表来实现。
- 基于数组的队列实现:使用一个数组和两个指针来表示队列,一个指针指向队首元素,一个指针指向队尾元素的下一个位置。
Enqueue操作时,将元素插入到队尾指针所指向的位置,然后将队尾指针向后移动;Dequeue操作时,将队首指针指向的元素弹出,然后将队首指针向后移动。