当前位置:文档之家› 数据结构(C语言版)3 栈和队列

数据结构(C语言版)3 栈和队列

typedef struct node { StackElementType data; struct node *next; }LinkStackNode; typedef LinkStackNode *LinkStack;
25
链栈基本操作的实现
int Push(LinkStack top, StackElementType x) /*将数据元素 压入栈 中*/ 将数据元素x压入栈 将数据元素 压入栈top中 {LinkStackNode * temp; temp=(LinkStackNode * )malloc(sizeof(LinkStackNode)); if(temp==NULL) return(FALSE); /*申 申 请空间失败*/ 请空间失败 temp->data=x; temp->next=top->next; top->next=temp; /*修改当前栈顶指针 */ 修改当前栈顶指针 return(TRUE);}
32
InitStack Push Pop
两栈共享基本操作的实现
int Pop(DqStack *S, StackElementType *x, int i) {switch(i) {case 0:if(S->top[0]==-1) return(FALSE); *x=S->Stack[S->top[0]]; S->top[0]--; break; case 1:if(S->top[1]==M) return(FALSE); *x=S->Stack[S->top[1]]; S->top[1]++;break; default: return(FALSE); } return(TRUE); }
7
栈的定义
栈作为一种限定性线性表,将线性表的插入和 作为一种限定性线性表 将线性表的插入和 删除运算限制为仅在表的一端进行,即 删除运算限制为仅在表的一端进行 即LIFO表。 表
通常将表中允许进行插入、 通常将表中允许进行插入、删除操作的一端称为 栈底(Bottom)。 栈顶 (Top),表的另一端被称为栈底 ,表的另一端被称为栈底 。 当栈中没有元素时称为空栈 空栈。 当栈中没有元素时称为空栈。栈的插入操作被形 象地称为进栈 入栈,删除操作称为出栈 退栈。 进栈或 出栈或 象地称为进栈或入栈,删除操作称为出栈或退栈。
21
顺序栈基本操作的实现
InitStack IsEmpty IsFull Push Pop GetTop
int GetTop(SeqStack *S, ( StackElementType *x) ) {/*将栈 的栈顶元素弹出,放到 所 将栈S的栈顶元素弹出 将栈 的栈顶元素弹出,放到x所 指的存储空间中, 指的存储空间中,但栈顶指针保持 不变*/ 不变 if(S->top==-1) /*栈为空 栈为空*/ 栈为空 return(FALSE); else {*x = S->elem[S->top]; return(TRUE); } }
30
两栈共享基本操作的实现
void InitStack(DqStack *S) { S->top[0]=-1; S->top[1]=M; }
InitStack Push Pop
31
两栈共享基本操作的实现
int Push(DqStack *S, StackElementType x, int i) {if(S->top[0]+1==S->top[1]) /*栈已满 栈已满*/ 栈已满 return(FALSE); switch(i) {case 0:S->top[0]++; S->Stack[S->top[0]]=x; break; case 1:S->top[1]--; S->Stack[S->top[1]]=x;break; default: return(FALSE) } return(TRUE); }
12
用C语言定义栈的顺序存储结构 语言定义栈的顺序存储结构
#define TRUE 1 #define FALSE 0 #define Stack_Size 50 typedef struct {StackElementType elem[Stack_Size]; /*用来存放栈中元素的一维数组 用来存放栈中元素的一维数组*/ 用来存放栈中元素的一维数组 int top; /*用来存放栈顶元素的下标 用来存放栈顶元素的下标*/ 用来存放栈顶元素的下标 }SeqStack;
5
线性表分类
Data can be inserted and deleted anywhere.
Data can only be inserted and deleted at the ends of the structure.
6
栈的定义
后进先出策略, 后进先出策略,即LIFO (Last In, First Out)
13
Push operation in a stack
Push adds an item at the top of the stack.
14
Pop operation in a stack
Pop removes the item at the top of the stack.
15
顺序栈Push、 Pop操作演示 、 顺序栈 操作演示
16
顺序栈基本操作的实现
InitStack IsEmpty IsFull Push Pop GetTop
17
void InitStack(SeqStack *S) {/*构造一个空栈 构造一个空栈S*/ 构造一个空栈 S->top= -1; }
可以改写成带返回值的形式吗? 可以改写成带返回值的形式吗? 如果可以,如何改写? 如果可以,如何改写?
26
Push Pop
链栈基本操作的实现
int Pop(LinkStack top, StackElementType *x) {/*将栈 的栈顶元素弹出,放到 所指 将栈top的栈顶元素弹出 将栈 的栈顶元素弹出,放到x所指 的存储空间中 */ LinkStackNode *temp; temp=top->next; if(temp==NULL) return(FALSE); top->next=temp->next; *x=temp->data; free(temp);/*释放存储空间 释放存储空间*/ 释放存储空间 return(TRUE); }
8
栈的抽象数据类型定义
数据元素:可以是任意类型的数据,但必须属于同 数据元素:可以是任意类型的数据,但必须属于同 一个数据对象。 一个数据对象。 关系:栈中数据元素之间是线性关系 关系:栈中数据元素之间是线性关系 基本操作: 基本操作:
Push Pop StackTop InitStack ClearStack IsEmpty IsFull GetTop …
9
第三章 栈和队列
栈 栈的定义 栈的表示和实现 两栈共享技术 栈与递归的实现 栈的应用举例 队列 要点小结
10
栈的表示和实现
栈在计算机中主要有两种基本的存储结 构:
顺序存储结构 链式存储结构
顺序存储的栈为顺序栈。 顺序存储的栈为顺序栈。 顺序栈 链式存储的栈为链栈 链栈。 链式存储的栈为链栈。11Fra bibliotek重点和难点
掌握栈和队列的基本操作实现算法
2
第三章 栈和队列
栈 栈的定义 栈的表示和实现 两栈共享技术 栈与递归的实现 栈的应用举例 队列 要点小结
3
第三章 栈和队列
栈 栈的定义 栈的表示和实现 两栈共享技术 栈与递归的实现 栈的应用举例 队列 要点小结
4
线性表的概念
线性表(Linear List)是由 是由n(n≥0)个数据元素 结 个数据元素(结 线性表 是由 个数据元素 ……,a 点)a1,a2,…… n组成的有限序列。 …… 组成的有限序列。
20
顺序栈基本操作的实现
InitStack IsEmpty IsFull Push Pop GetTop 比较Push和Pop实现时的异同 和 比较 实现时的异同 哪个是正确的? 哪个是正确的?
int Pop(SeqStack *S, StackElementType *x) {if(S->top==-1) return(FALSE); else {*x= S->elem[S->top]; S->top--;/*修改栈顶指针 修改栈顶指针*/ 修改栈顶指针 return(TRUE);} }
顺序栈基本操作的实现
InitStack IsEmpty IsFull Push Pop GetTop
18
int IsEmpty(SeqStack *S) /*判栈 为空栈时返回值为真,反之 判栈S为空栈时返回值为真 判栈 为空栈时返回值为真, 为假*/ 为假 { return(S->top==-1?TRUE:FALSE); }
顺序栈基本操作的实现
InitStack IsEmpty IsFull Push Pop GetTop
int IsFull(SeqStack *S) /*判栈 为满时返回真 否则返回假 判栈S为满时返回真 否则返回假*/ 判栈 为满时返回真,否则返回假 {
return(S->top== Stack_Size-1 ? TRUE:FALSE);
22
链栈
链栈是采用链表作为存储结构实现的栈。 链栈是采用链表作为存储结构实现的栈。为便 是采用链表作为存储结构实现的栈 于操作,采用带头结点的单链表实现栈。 于操作,采用带头结点的单链表实现栈。
链栈在使用完毕时,应该释放其空间。 链栈在使用完毕时,应该释放其空间。
相关主题