栈
定义
栈是限定仅在表尾进行插入或删除操作的线性表。(限定存取点的线性结构)
表尾端称为栈顶,表头端称为栈底。
操作特性:后进先出(last in first out)
n n n个不同元素进栈,出栈元素不同排列的个数为 1 n + 1 ∗ C 2 n n \frac{1}{n+1}*C_{2n}^{n} n+11∗C2nn,卡特兰数。
栈的顺序存储结构
顺序栈的实现
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够大使用时再逐渐扩大:
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
栈的初始化操作为:
1.按照初始分配量进行第一次存储分配,base为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。
2.top栈顶指针,其初始值指向栈底,即top=base可作为栈空的标记,插入时top加1,删除时top减1
顺序栈的基本运算
#define STACK_INIT_SIZE 100; //存储空间初始分配量
#define STACKINCRREMENT 10; //存储空间分配增量
typedef struct{
SElemType *base; //在栈构造之前和销毁之后,base的值为null
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
Status InitStack(SqStack &S){
//构造一个空栈S
S.base=(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S.base) //存储分配失败
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
Status GetTop(SqStack S,SElemType &e){
//若栈不为空,用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK:
}//GetTop
Status Push(SqStack &S,SElemType &e){
//插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize){
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SELemTYpe));
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e; //先加后赋值
return OK;
}//push
Status Pop(SqStack &S,SelemType &e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top=S.base) return ERROR;
e=*(--S.top);//先赋值再减
return OK;
}
共享栈
两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置再共享空间的两端,两个共享空间向中间延伸。
数组的取值范围为
[
0
,
M
a
x
S
i
z
e
−
1
]
[0,MaxSize-1]
[0,MaxSize−1],
t
o
p
0
=
−
1
top0=-1
top0=−1时,0号栈为空;
t
o
p
1
=
M
a
x
S
i
z
e
top1=MaxSize
top1=MaxSize时,1号栈为空。仅当两栈顶指针相邻(
t
o
p
1
−
t
o
p
0
=
1
top1-top0=1
top1−top0=1时),判断为栈满。
共享栈是为了更有效地利用存储空间,两个栈相互调节,只有整个存储空间被占满时才发生上溢。
栈的链式存储结构
链栈的优点:便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。
栈的链式存储结构可描述为:
typedef struct Linknode{
ElemType data; //数据域
struct Linknode *next; //指针域
}*LiStack; //栈类型定义
队列
定义
队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端删除。
操作特性:先进先出(first in first out)。
队列的顺序存储结构
队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针。
存储类型可以描述为:
#define MaxSize 50 //元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放列队元素
int front,rear; //队头指针和队尾指针
}SqQueue;
void InitQueue(SqQueue &Q){
//初始时,队头队尾指向0
Q.front=Q.rear=0;
}