栈和队列
  UAumRbrjkLkS 2023年11月02日 23 0

栈:

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。遵循后进先出。

  • 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶
栈的实现

数组和链表都能实现:

数组:让数组的尾巴作为栈顶,起始位置用作栈底。O(1)———建议使用数组

链表:让链表的起始结点作为栈顶,链表的尾节点作为栈底(如果直接尾插尾插尾删,时间复杂度为O(n))

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int STDataType;

//栈的结构
typedef struct Stack {
   STDataType* arr;
   int top;
   int capacity;
}ST;
void StackInit(ST* ps) {
	assert(ps);
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}
void StackDesTroy(ST* ps) {
	assert(ps);
	//栈的销毁
	if (ps->arr) {
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}
void StackPush(ST* ps, STDataType x) {
	if (ps->top == ps->capacity) {
		//增容
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType *tmp = (STDataType*)realloc(ps->arr, sizeof(STDataType) * newcapacity);
		//ps->arr = (STDataType*)realloc(ps->arr, sizeof(STDataType) * (newcapacity));
		if (tmp == NULL) {
			printf("realloc fail");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
	ps->arr[ps->top] = x;
	ps->top++;

}
void StackPop(ST* ps) {
	

}
void Test01() {
	ST st;
	StackInit(&st);
	StackPush(&st,1);
	StackPush(&st, 2);
	StackPush(&st, 3);
}
int main() {
	Test01();

	return 0;
}

队列:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

  • 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  anLrwkgbyYZS   2023年12月30日   28   0   0 i++iosi++ioscici
  anLrwkgbyYZS   2023年12月30日   31   0   0 ideciciMaxideMax
UAumRbrjkLkS
作者其他文章 更多