编程语言   发布时间:2022-06-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了我爷爷都看的懂的《栈和队列》,学不会来打我大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

栈和队列

目录

        • 顺序栈
          • 顺序栈定义
          • 顺序栈初始化
          • 入栈
          • 出栈
          • 读栈顶元素
          • 判断栈是否为空
        • 共享栈
          • 定义
          • 初始化
          • 入栈
          • 出栈
        • 链栈
      • 队列
        • 顺序队列
          • 定义
          • 初始化
          • 入队
          • 出队
          • 获取队头元素
          • 判断队列是否为空
        • 队列链式存储
          • 定义
          • 初始化
          • 入队
          • 出队
          • 判断队列是否为空
        • 队列链式存储(不带头结点)
          • 定义
          • 初始化
          • 入队
          • 出队
          • 判断队列是否为空

  • 定义:是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作

顺序栈

顺序栈定义
  • 采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置
#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int top;
}SqStack;
顺序栈初始化
//初始化
void InitStack(SqStack& S) {
	S.top = -1;  //data[0]还没有放数据元素
}
入栈
//入栈
bool Push(SqStack& S, int x) {
	if (S.top == MaxSize - 1)
		return false;
	S.top = S.top + 1;//初始指向data[-1]
	S.data[S.top] = x;
	//等价于
	//S.data[++S.top] = x;
	return true;
}
出栈
//出栈
bool Pop(SqStack& S, int& x) {
	if (S.top == -1)
		return false;
	x = S.data[S.top];
	S.top = S.top - 1;
	//等价于
	//x = S.data[S.top--];
	return true;
}
读栈顶元素
//读栈顶元素
bool GetTop(SqStack S, int& x) {
	if (S.top == -1)
		return false;
	x = S.data[S.top];
	return true;
}
判断栈是否为空
//判断栈是否为空
bool StackEmpty(SqStack S) {
	if (S.top == -1) //栈空
		return true;
	else
		return false;
}

共享栈

定义
  • 利用栈底位置相对不变的特征,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
#define MaxSize 10

typedef struct {
	int data[MaxSize];
	int top0;
	int top1;
}ShStack;

ShStack s; //全局变量
初始化
//初始化栈
void InitStack(ShStack& s) {
	s.top1 = MaxSize;  //上
	s.top0 = -1;//下
}
入栈
//入栈
int push(int i, int x) {
	if (i < 0 || i>1) {
		cout << "栈号输入不对" << endl;
		exit(0);
	}
	if (s.top1 - s.top0 == 1) {
		cout << "栈满了" << endl;
		return 0;
	}
	switch (i)
	{
	case 0:s.data[++s.top0] = x;
		break;
	case 1:s.data[--s.top1] = x;
		break;
	}
}
出栈
//出栈
int pop(int i) {
	if (i < 0 || i>1) {
		cout << "栈号输入错误" << endl;
		exit(0);
	}
	switch (i) {
	case 0:
		if (s.top0 == -1) {
			cout << "栈空" << endl;
		}
		else {
			//return s.data[s.top0--];
			cout << s.data[s.top0--] << endl;
		}
		break;
	case 1:
		if (s.top1 == MaxSize) {
			cout << "栈空" << endl;
		}
		else {
			//return s.data[s.top1++];
			cout << s.data[s.top1++] << endl;
		}
		break;
	}
}

链栈

  • 采用链式存储的栈称为链栈,链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。

类似单链表的头插法

队列

顺序队列

定义
  • 队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:队头指针 front指向队头元素,队尾指针 rear 指向队尾元素的下一个位置
#define MaxSize 10
typedef struct {
	int data[MaxSize];
	int front, rear; //队头和队尾指针
}SqQueue;
初始化
//初始化
void InitQueue(SqQueue& Q) {
	Q.rear = Q.front = 0;
}
入队
//入队
bool EnQueue(SqQueue& Q, int x) {
	if ((Q.rear + 1) % MaxSize == Q.front) //牺牲一个节点空间
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;
	return true;
}
出队
//出队
bool DeQueue(SqQueue& Q, int& x) {
	if (Q.rear == Q.front) //判断队空
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;
	return true;
}
获取队头元素
//获取队头元素
bool GetHead(SqQueue Q, int& x) {
	if (Q.rear == Q.front)
		return false;
	x = Q.data[Q.front];
	return true;
}
判断队列是否为空
//判断队列是否为空
bool QueueEmpty(SqQueue Q) {
	if (Q.rear == Q.front) //对空条件
		return true;
	else
		return false;
}

队列链式存储

定义
  • 队列的链式存储结构表示为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,只不过它只能尾进头出而已
typedef struct LinkNode {
	int data;
	struct LinkNode* next;
}LinkNode;

typedef struct {
	LinkNode* front, * rear; //队头和队尾指针
}LinkQueue;
初始化
//初始化
void InitQueue(LinkQueue& Q) {
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next = NULL;
}
入队
//入队
void EnQueue(LinkQueue& Q, int x) {
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	Q.rear->next = s;
	Q.rear = s;
}
出队
//出队
bool DeQueue(LinkQueue& Q, int& x) {
	if (Q.front == Q.rear)
		return false;  //空队
	LinkNode* p = Q.front->next;
	x = p->data;
	Q.front->next = p->next;
	if (Q.rear == p)
		Q.rear = Q.front;
	free(p);
	return true;
}
判断队列是否为空
//判断队列是否为空
bool IsEmpty(LinkQueue Q) {
	if (Q.front == Q.rear)
		return true;
	else
		return false;
}

队列链式存储(不带头结点)

定义
typedef struct LinkNode {
	int data;
	struct LinkNode* next;
}LinkNode;

typedef struct {
	LinkNode* front, * rear; //队头和队尾指针
}LinkQueue;
初始化
//初始化
void InitQueue(LinkQueue& Q) {
	Q.front = NULL;
	Q.rear = NULL;
}
入队
//入队(不带头结点)
void EnQueue(LinkQueue& Q, int x) {
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	if (Q.front == NULL) {
		Q.front = s;
		Q.rear = s;
	} else {
		Q.rear->next = s;
		Q.rear = s;
	}
}
出队
//出队(不带头结点)
bool DeQueue(LinkQueue& Q, int& x) {
	if (Q.front == NULL)
		return false;
	LinkNode* p = Q.front;
	x = p->data;
	Q.front = p->next;
	if (Q.rear == p) { //此次是最后一个节点出队
		Q.front = NULL;
		Q.rear = NULL;
	}
	free(p);
	return true;
}
判断队列是否为空
//判断队列是否为空
bool IsEmpty(LinkQueue Q) {
	if (Q.rear == NULL)
		return true;
	else
		return false;
}

此博文的分享就到此啦,点个关注再走吧 ✨你好啊,我是“ 满级小白”,是一名在校大学生。 🌍主页链接:满级小白的博客 ☀️博文主更方向为:计算机408数据库javaEE随着专业的深入会越来越广哦…一起期待。 ❤️人生的每一次成长,都是从“觉得自己是个傻逼”开始的,人生每一次的陷入困境,都是从“觉得别人是个傻逼”开始的。 💪很高兴与你相遇,一起加油!!!!

大佬总结

以上是大佬教程为你收集整理的我爷爷都看的懂的《栈和队列》,学不会来打我全部内容,希望文章能够帮你解决我爷爷都看的懂的《栈和队列》,学不会来打我所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: