数据结构——栈与队列
作者:互联网
文章目录
栈
栈是一种线性的存储结构,一般有顺序栈和链式栈两种存在形式。栈的最大特点为后进先出,只在栈顶进行操作。
如图,进栈的顺序是ABCD。但出栈时,只能从栈顶出栈,所以出栈顺序为DCBA。
顺序栈
我习惯于将顺序栈看作一个倒放的数组,栈底为数组的第一个元素。这样后续对于栈的操作便会好理解许多。
基本结构
typedef struct SqStack {
Elemtype* base;
Elemtype* top;
int stacksize;
}SqStack;
基础操作
//栈的初始化
void InitStack(SqStack *S) {
S->base = (Elemtype*)malloc(S->stacksize * sizeof(Elemtype));
if (!S->base) printf("分配失败");
S->top = S->base;
}
//栈是否为空的判断
bool JudgeStack(SqStack* S) {
if (S->base == S->top)
return true;//栈空则返回true
else
return false;
}
//栈的清空
void ClearStack(SqStack* S) {
S->top = S->base;
}
//栈的销毁
void DestroyStack(SqStack* S) {
if (!JudgeStack(S)) {
free(S->base);
S->base = 0;
S->base = S->top = NULL;
}
}
//入栈
void Push(SqStack* S, Elemtype e) {
if (S->top - S->base == S->stacksize) {
//栈满时直接扩大栈的内存
S->base = (Elemtype*)realloc(S->base, S->stacksize * sizeof(Elemtype));
S->top = S->base + S->stacksize;
S->stacksize *= 2;
}
*S->top = e;
S->top++;
}
//出栈并返回栈顶元素
bool Pop(SqStack* S, Elemtype *e) {
if (S->top == S->base) {
return false;
}
S->top--;
*e = *S->top;
}
链式栈
链式栈则是一种基于链表操作的栈。相比于常见的单链表,链式栈不过是只能从链表的一端进行插入和删除的操作罢了,并没有其他神秘的点。由于队列部分有链队的详细操作,二者结合便可大概知道链式栈的模样,在这里就不详细列出其操作。
队列
与栈相比,队列的特点是先进先出,也可理解为头进尾出。像这样
标签:Qnode,队列,Elemtype,top,base,front,数据结构 来源: https://blog.csdn.net/m0_62955663/article/details/123618288