目录
栈和队列的定义和特点
栈
队列
栈的实现
顺序栈的实现
顺序栈的存储结构
初始化
入栈
出栈
取栈顶元素
链栈
特点
链栈的存储结构
初始化
入栈
出栈
取栈顶元素
栈是限定只能在表尾进行插入和删除操作的线性表。对栈来说,表尾端称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。
栈是先进后出,后进先出的线性表。
1
队列是一种先进先出的线性表,只允许在队尾插入,队头删除元素。
2
顺序栈是利用顺序存储结构实现的栈。设置指针top指示栈顶元素在
顺序栈中的位置,以top=0表示空栈。设置指针base指示栈底元素在顺序栈中的位置。staksize指栈可使用的最大容量。
当top==base时,表示空栈。
当top-base==staksize时,表示栈满。
typedef struct {
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
} SqStack;
1.让base指向栈底
2.初始化为空栈
Status InitStack(SqStack &S) {
//构造一个空栈S
S.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if (!S.base)
exit(OVERFLOW); //存储分配失败
S.top = S.base; //top初始为base,空栈
S.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
1.判断是否满栈
2.将新元素压入栈顶
Status Push(SqStack &S, SElemType e) {
// 插入元素e为新的栈顶元素
if (S.top - S.base == S.stacksize)
return ERROR; //栈满
*(S.top++) = e; //元素e压入栈顶,栈顶指针加1
return OK;
}
1.判断是否空栈
2.栈顶指针减一,栈顶元素出栈
Status Pop(SqStack &S, SElemType &e) {
//删除S的栈顶元素,用e返回其值
if (S.base == S.top)
return ERROR;//栈空
e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e
return OK;
}
char GetTop(SqStack S) {//返回S的栈顶元素,不修改栈顶指针
if (S.top != S.base) //栈非空
return *(S.top - 1); //返回栈顶元素的值,栈顶指针不变
}
顺序栈和顺序表一样,容易受最大空间容量的影响,满栈时扩大容量较复杂,所以可以使用链栈来处理问题。
链栈采用链式存储结构来实现,用单链表来表示。链栈不需要设置头结点。
typedef struct StackNode {
SElemType data;
struct StackNode *next;
} StackNode, *LinkStack;
让栈顶指针为空
Status InitStack(LinkStack &S) { // 构造一个空栈 S,栈顶指针置空
S = NULL;
return OK;
}
链栈入栈不需要判断满栈
1.为入栈元素e分配空间
2.将新结点数据域置为e
3.插入新结点
4.修改栈顶指针
Status Push(LinkStack &S, SElemType e) {//在栈顶插入元素e
LinkStack p;
p = new StackNode; //生成新结点
p->data = e; //将新结点数据域置为e
p->next = S; //将新结点插入栈顶
S = p; //修改栈顶指针为p
return OK;
}
链栈出栈需要判断空栈
1.将栈顶元素赋给e
2.临时保存栈顶元素空间
3.修改栈顶指针
4.释放
Status Pop(LinkStack &S, SElemType &e) {//删除S的栈顶元素,用e返回其值
LinkStack p;
if (S == NULL)
return ERROR; //栈空
e = S->data; //将栈顶元素赋给e
p = S; //用p临时保存栈顶元素空间,以备释放
S = S->next; //修改栈顶指针
delete p; //释放原栈顶元素的空间
return OK;
}
SElemType GetTop(LinkStack S) {//返回S的栈顶元素,不修改栈顶指针
if (S != NULL) //栈非空
return S->data; //返回栈顶元素的值,栈顶指针不变
}