其他分享
首页 > 其他分享> > 数据结构——栈与队列

数据结构——栈与队列

作者:互联网

文章目录

栈是一种线性的存储结构,一般有顺序栈和链式栈两种存在形式。栈的最大特点为后进先出,只在栈顶进行操作。

在这里插入图片描述
如图,进栈的顺序是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