栈和队列基本概念、实现和考研习题 下载本文

内容发布更新时间 : 2024/12/23 23:51:09星期一 下面是文章的全部内容请认真阅读。

目录

栈和队列........................................................................................................................................... 1

1. 栈....................................................................................................................................... 1

1.1 1.2 1.3 1.4

栈的基本概念 ....................................................................................................... 1 栈的顺序存储结构 ............................................................................................... 1 栈的链式存储结构 ............................................................................................... 3 习题 ....................................................................................................................... 3

2. 队列 ................................................................................................................................... 6

2.1 2.2 2.3 2.4

队列的基本概念 ................................................................................................... 6 队列的顺序存储结构 ........................................................................................... 6 队列的链式存储结构 ........................................................................................... 8 习题 ....................................................................................................................... 9

3. 栈和队列的应用 ............................................................................................................. 14

3.1

习题 ..................................................................................................................... 14

栈和队列

1. 栈 1.1

栈的基本概念

1.1.1 栈的定义

栈(Stack):只允许在一端进行插入或删除操作的线性表。 栈顶(Top):线性表允许进行插入和删除的那一端

栈底(Bottom): 固定的,不允许进行插入和删除操作的另一端。 空栈:不含任何元素的空表。

栈的一个明显的操作特性:后进先出(Last In First Out, LIFO),故又称为后进先出的线性表。

1.1.2 栈的基本操作

InitStack(&S):初始化一个空栈S。

StackEmpty(S):判断一个栈是否为空,若栈S为空返回true,否则返回false。 Push(&S,x):进栈,若栈S未满,将x加入使之成为新栈顶。 Pop(&S,&x)出栈,若栈S非空,弹出栈顶元素,并用x返回。 GetTop(S,&x):读栈顶元素,若栈S非空,用x返回栈顶元素。 ClearStack(&S):销毁栈,并释放栈S所占的存储空间。

在解答算法题时,若题干没有做出限制,可以直接使用这些基本的操作函数。

1.2 栈的顺序存储结构

1.2.1 顺序栈的实现

栈的顺序存储称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。 栈的顺序存储类型可描述为:

#defineMaxSize 50 //定义栈中元素的最大个数 typedefstruct {

ElemType data[MaxSize]; //存放栈中元素 int top; //栈顶指针

}SqStack;

栈顶指针:S.top,初始时设置S.top=-1;栈顶元素:S.data[S.top]。 进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。 出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1。

栈空条件:S.top==-1;栈满条件:S.top==MaxSize-1;栈长:S.top+1。

1.2.2 顺序栈的基本运算

(1) 初始化

voidInitStack(SqStack&S) {

1

}

S.top = -1; //初始化栈顶指针

(2) 判空栈

boolStackEmpty(SqStack&S) { }

if (S.top == -1) //栈空

returntrue;

returnfalse; else//不空

(3) 进栈

bool Push(SqStack&S, ElemTypex) { }

if (S.top == MaxSize - 1) //栈满,报错

returnfalse;

S.data[++S.top] = x; //指针先加1,再入栈 returntrue;

(4) 出栈

bool Pop(SqStack&S, ElemType&x) { }

if (S.top == -1) //栈空,报错

returnfalse;

x = S.data[S.top--]; //先出栈,指针再减1 returntrue;

(5) 读栈顶元素

boolGetTop(SqStack&S, ElemType&x) { }

if (S.top == -1) //栈空,报错

returnfalse;

x = S.data[S.top]; //x记录栈顶元素 returntrue;

注意:这里栈顶指针指向的就是栈顶元素,所以进栈时的操作是S.data[++S.top] = x;出栈时的操作时x = S.data[S.top--]。如果栈顶指针初始化为S.top=0,即栈顶指针指向栈顶元素的下一个位置,则入栈操作变为S.data[S.top++] = x;出栈操作变为x = S.data[--S.top]。相应的栈空、栈满条件也会发生变化。

1.2.3 共享栈

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。

两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空;仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减1再赋值;出栈时则刚好相反。 共享栈是为了更有效地利用存储空间,两个栈地空间相互调节,只有在整个存储空间被占满时才发生上溢。其存取数据的时间复杂度均为O(1),所以对存取效率没有什么影响。

2