数据结构03:栈、队列和数组 队习题01[C++]

这篇具有很好参考价值的文章主要介绍了数据结构03:栈、队列和数组 队习题01[C++]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  数据结构03:栈、队列和数组 队习题01[C++],# 数据结构,数据结构,c++,开发语言

考研笔记整理~🥝🥝

之前的博文链接在此:数据结构03:栈、队列和数组_-CSDN博客~🥝🥝

本篇作为链表的代码补充,供小伙伴们参考~🥝🥝

  • 第1版:王道书的课后习题~🧩🧩

编辑:梅头脑🌸

参考用书:王道考研《2025年 数据结构考研复习指导》


目录

🧵01 不牺牲存储单元的单链表

🧵02 队列元素逆置

🧵03 利用两个栈模拟队列

🧵04 链栈

🔚结语


🧵01 不牺牲存储单元的单链表

🧩题目

若希望循环队列中的元素都能得到利用,则需设置一个标志域 tag,并以 tag 的值为 0或1来区分队头指针 front 和队尾指针 rear 相同时的队列状态是“空”还是“满”试编写与此结构相应的入队和出队算法。

📇解题思路

虽然 入栈和出栈的指针判断均为 front == rear,但是考虑到仅入栈会导致栈满,出栈是导致栈空,因为,入栈与出栈的条件如下:

  • tag == 1(上一次为入队操作) && front == rear 时,表示栈满;
  • tag == 0(上一次为出队操作) && front == rear 时,表示栈空;

⌨️解题代码

#include <iostream>
using namespace std;

const int MaxSize = 5;
typedef struct {
	int data[MaxSize];
	int front, rear;
	int tag;
}SeQueue;

class Queue {
private:
	SeQueue* q;
public:
	Queue();
	~Queue();
	bool IsEmpty();
	bool IsFull();
	bool EnQueue(int x);
	bool DeQueue(int& x);
};

Queue::Queue() {
	q = new SeQueue;
	q->front = q->rear = 0;
	q->tag = 0;
}
Queue::~Queue() {
	delete q;
}
bool Queue::IsEmpty() {
	if (q->front == q->rear && q->tag == 0) { cout << "队列为空"; return true; }
	else { cout << "队列不空"; return false; }
}
bool Queue::IsFull() {
	if (q->front == q->rear && q->tag == 1) { cout << "队列已满"; return true; }
	else { cout << "队列未满"; return false; }
}
bool Queue::EnQueue(int x) {
	if (IsFull() == true) { cout << " 入队失败" << endl; return false; }
	q->data[q->rear] = x;
	q->rear = (q->rear + 1) % MaxSize;
	q->tag = 1;
	cout << " 元素" << x << "入队成功" << endl; return true;
}
bool Queue::DeQueue(int& x) {
	if (IsEmpty() == true) { cout << " 出队失败" << endl; return false; }
	x = q->data[q->front];
	q->front = (q->front + 1) % MaxSize;
	q->tag = 0;
	cout << " 元素" << x << "出队成功" << endl; return true;
}

int main()
{
	Queue q;
	int x;
	q.EnQueue(1);
	q.EnQueue(2);
	q.EnQueue(3);
	q.EnQueue(4);
	q.EnQueue(5);
	q.EnQueue(6); // 队列已满, 入队失败
	q.DeQueue(x); cout << "出队元素:" << x << endl;
	q.DeQueue(x); cout << "出队元素:" << x << endl;
	q.DeQueue(x); cout << "出队元素:" << x << endl;
	q.DeQueue(x); cout << "出队元素:" << x << endl;
	q.DeQueue(x); cout << "出队元素:" << x << endl;
	q.DeQueue(x); // 队列为空, 出队失败

	return 0;
}

数据结构03:栈、队列和数组 队习题01[C++],# 数据结构,数据结构,c++,开发语言


🧵02 队列元素逆置

🧩题目

只是一个队列,S是一个空栈,实现将队列中的元素逆置的算法。

📇解题思路

先把队的东西导入栈,再次出栈入队时即可实现逆序存储~

⌨️解题代码

#include <iostream>
#include <queue>
#include <stack>
using namespace std;

bool Reverse(queue<int>& q) {
	stack<int> s;
 
	// 队列q中的元素全部入栈s
	while (!q.empty()) {
		s.push(q.front());
		q.pop();
	}
 
	// 栈s中的元素全部入队列q
	while (!s.empty()) {
		q.push(s.top());
		s.pop();
	}
	return true;
}

int main() {
	queue<int> q;

	q.push(1);
	q.push(2);
	q.push(3);

	bool result = Reverse(q);

	while (!q.empty()) {
		cout << q.front() << " ";
		q.pop();
	}
	return 0;
}

数据结构03:栈、队列和数组 队习题01[C++],# 数据结构,数据结构,c++,开发语言


🧵03 利用两个栈模拟队列

🧩题目

利用两个栈 S1 和 S2 来模拟一个队列,已知栈的4个运算定义如下:
Push(S,x);                //元素x入栈 s
Pop(S,x);                  //s出栈并将出栈的值赋给x
StackEmpty(S);        //判断栈是否为空
StackOverflow(S);    //判断栈是否满
如何利用栈的运算来实现该队列的3个运算(形参由读者根据要求自己设计)?
Engueue;                  //将元素x入队
Dequeue;                  //出队,并将出队元素存储在x中
QueueEmpty;            //判断队列是否为空

📇解题思路

入栈的时候直接进S1,但是出栈时就不能直接从S1出栈了:栈顶元素出栈,不满足队列要求;

然而,S1的元素导入S2就可以实现一个负负得正的效果,因此,出栈的时候,先把S1的元素搬入S2,然后直接从S2中出栈~

⌨️解题代码

#include <iostream>
#include <stack>
using namespace std;

const int MaxSize = 5;

class Queue {
private:
	stack<int> s1;
	stack<int> s2;
	int size;
public:
	Queue();
	~Queue();
	bool Enqueue(int x);
	bool Dequeue(int& x);
	bool QueueEmpty();
};

Queue::Queue() {
	size = 0;
}
Queue::~Queue() {
}
bool Queue::Enqueue(int x) {
	if (size == MaxSize) {
		cout << "队列已满" << endl;
		return false;
	}
	s1.push(x);
	size++;
	cout << "元素" << x << "入队成功" << endl;
	return true;
}
bool Queue::Dequeue(int& x) {
	if (size == 0) {
		cout << "队列为空" << endl;
		return false;
	}
	// 如果s2为空, 则将s1中的元素全部转移到s2中;否则s2不为空, 元素直接出队
	if (s2.empty()) {
		while (!s1.empty()) {
			s2.push(s1.top());
			s1.pop();
		}
	}
	x = s2.top();
	s2.pop();
	size--;
	cout << "元素" << x << "出队成功" << endl;
	return true;
}
bool Queue::QueueEmpty() {
	if (size == 0) {
		cout << "队列为空" << endl;
		return true;
	}
	else {
		cout << "队列不空" << endl;
		return false;
	}
}

int main() {
	Queue q;
	int x;
	q.Enqueue(1); // 栈S1:1,栈S2:空
	q.Enqueue(2); // 栈S1:1 2,栈S2:空
	q.Enqueue(3); // 栈S1:1 2 3,栈S2:空
	q.Dequeue(x); // 栈S1:空,栈S2: 3 2
	q.Enqueue(4); // 栈S1:4,栈S2:3 2
	q.Enqueue(5); // 栈S1:4 5,栈S2:3 2
	q.Enqueue(6); // 栈S1:4 5 6,栈S2:3 2
	q.Dequeue(x); // 栈S1:4 5 6,栈S2:3 
	q.Enqueue(7); // 栈S1:4 5 6 7,栈S2:3
	q.Enqueue(8); // 队列已满, 入队失败
	q.Dequeue(x); // 栈S1:4 5 6 7,栈S2:空
	q.Dequeue(x); // 栈S1:空,栈S2:7 6 5 4
	q.Dequeue(x); // 栈S1:空,栈S2:7 6 5
	q.Dequeue(x); // 栈S1:空,栈S2:7 6
	q.Dequeue(x); // 栈S1:空,栈S2:7
	q.Dequeue(x); // 队列为空, 出队失败
	return 0;
}

数据结构03:栈、队列和数组 队习题01[C++],# 数据结构,数据结构,c++,开发语言


🧵04 链栈

🧩题目

【2019 统考真题】请设计一个队列,要求满足:①初始时队列为空;②入队时,允许增加队列占用空间;③出队后,出队元素所占用的空间可重复使用,即整个队列所占用的空间只增不减;④入队操作和出队操作的时间复杂度始终保持为0(1)。请回答:

        1)该队列是应选择链式存储结构,还是应选择顺序存储结构?
        2)画出队列的初始状态,并给出判断队空和队满的条件。
        3)画出第一个元素入队后的队列状态。
        4)给出入队操作和出队操作的基本过程。

📇算法思路

  • 链栈可以灵活增加队列占用空间,满足题目要求;而如果使用动态循环数组,平时查询和删除的时间复杂度是O(1),但是扩容的时间复杂度是O(n),这一点就不用考虑了~
  • 如果元素出队不想占用空间,那front指针直接从head后移就可以了,移动到front == rear,就是移动到末尾了~
  • emm...不过以下的代码,还是实现了删除的功能(感觉一直占用空间不删除怪怪的...)

⌨️算法代码(单链表版本)

#include <iostream>
using namespace std;

typedef struct LinkNode {
	int data;
	LinkNode* next;
	LinkNode() : data(0), next(nullptr) {}
	LinkNode(int x) : data(x), next(nullptr) {}
}LinkNode;

class LinkQueue {
private:
	LinkNode* head;
	LinkNode* front;
	LinkNode* rear;
public:
	LinkQueue();
	~LinkQueue();
	bool IsEmpty();
	bool EnQueue(int x);
	bool DeQueue(int& x);
};

LinkQueue::LinkQueue() {
	head = new LinkNode;
	front = rear = head;
}
LinkQueue::~LinkQueue() {
	delete head;
}
bool LinkQueue::IsEmpty() {
	if (front->next == nullptr) { cout << "队列为空 "; return true; }
	else { cout << "队列不空 "; return false; }
}
bool LinkQueue::EnQueue(int x) {
	LinkNode* p = new LinkNode(x);
	if (p == nullptr) { cout << "出队失败" << endl; return false; }
	rear->next = p;
	rear = p;
	cout << "元素" << x << "入队成功" << endl; return true;
}
bool LinkQueue::DeQueue(int& x) {
	if (IsEmpty() == true) { cout << "入队失败" << endl; return false; }
	LinkNode* p = front->next;
	x = p->data;
	front->next = p->next;
  delete p;
	cout << "元素" << x << "出队成功" << endl; return true;
}

int main()
{
	LinkQueue q;
	int x;
	q.EnQueue(1); // 队q:1
	q.EnQueue(2); // 队q:1 2
	q.EnQueue(3); // 队q:1 2 3
	q.DeQueue(x); // 队q:2 3
	q.EnQueue(4); // 队q:2 3 4
	q.EnQueue(5); // 队q:2 3 4 5
	q.EnQueue(6); // 队q:2 3 4 5 6
	q.DeQueue(x); // 队q:3 4 5 6
	q.EnQueue(7); // 队q:3 4 5 6 7
	q.EnQueue(8); // 队q:3 4 5 6 7 8
	q.DeQueue(x); // 队q:4 5 6 7 8
	q.DeQueue(x); // 队q:5 6 7 8
	q.DeQueue(x); // 队q:6 7 8
	q.DeQueue(x); // 队q:7 8
	q.DeQueue(x); // 队q:8
	q.DeQueue(x); // 队q: 空
	q.DeQueue(x); // 队列为空, 出队失败

	return 0;
}

数据结构03:栈、队列和数组 队习题01[C++],# 数据结构,数据结构,c++,开发语言

⌨️算法代码(循环单链表版本)

#include <iostream>
using namespace std;

typedef struct LinkNode {
	int data;
	LinkNode* next;
	LinkNode() : data(0), next(nullptr) {}
	LinkNode(int x) : data(x), next(nullptr) {}
}LinkNode;

class LinkQueue {
private:
	LinkNode* head;
	LinkNode* front;
	LinkNode* rear;
public:
	LinkQueue();
	~LinkQueue();
	bool IsEmpty();
	bool EnQueue(int x);
	bool DeQueue(int& x);
};

LinkQueue::LinkQueue() {
	head = new LinkNode;
	front = rear = head;
}
LinkQueue::~LinkQueue() {
	delete head;
}
bool LinkQueue::IsEmpty() {
	if (head->next == head) { cout << "队列为空 "; return true; }
	else { cout << "队列不空 "; return false; }
}
bool LinkQueue::EnQueue(int x) {
	LinkNode* p = new LinkNode(x);
	if (p == nullptr) { cout << "入队失败" << endl; return false; } // 分配结点失败(内存已满
	rear->next = p;
	rear = p;
	rear->next = front;
	cout << "元素" << x << "入队成功" << endl; return true;
}
bool LinkQueue::DeQueue(int& x) {
	if (IsEmpty() == true) { cout << "出队失败" << endl; return false; }
	LinkNode* p = front->next;
	x = p->data;
	front->next = p->next;
	delete p;
	cout << "元素" << x << "出队成功" << endl; return true;
}

int main()
{
	LinkQueue q;
	int x;
	q.EnQueue(1); // 队q:1
	q.EnQueue(2); // 队q:1 2
	q.EnQueue(3); // 队q:1 2 3
	q.DeQueue(x); // 队q:2 3
	q.EnQueue(4); // 队q:2 3 4
	q.EnQueue(5); // 队q:2 3 4 5
	q.EnQueue(6); // 队q:2 3 4 5 6
	q.DeQueue(x); // 队q:3 4 5 6
	q.EnQueue(7); // 队q:3 4 5 6 7
	q.EnQueue(8); // 队q:3 4 5 6 7 8
	q.DeQueue(x); // 队q:4 5 6 7 8
	q.DeQueue(x); // 队q:5 6 7 8
	q.DeQueue(x); // 队q:6 7 8
	q.DeQueue(x); // 队q:7 8
	q.DeQueue(x); // 队q:8
	q.DeQueue(x); // 队q: 空
	q.DeQueue(x); // 队列为空, 出队失败

	return 0;
}

数据结构03:栈、队列和数组 队习题01[C++],# 数据结构,数据结构,c++,开发语言


🔚结语

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,收到点赞的话,博主肝文的动力++~🌟🌟

同系列的博文:🌸数据结构_梅头脑_的博客-CSDN博客

同博主的博文:🌸随笔03 笔记整理-CSDN博客文章来源地址https://www.toymoban.com/news/detail-849898.html

到了这里,关于数据结构03:栈、队列和数组 队习题01[C++]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构01-线性结构-链表栈队列-栈篇

    线性结构-栈 本系列为C++数据结构系列,会介绍 线性结构,简单树,特殊树,简单图等。本文为线性结构部分。 线性结构 【 3 】链表:单链表、双向链表、循环链表 【 3 】栈 【 3 】队列 栈是Stack一个后进先出Last In First Out,LIFO的线性表,他要求只在表尾对数据执行删除和插

    2024年02月16日
    浏览(41)
  • 【数据结构】——串,数组,矩阵的相关习题

    1、数组通常具有的两种基本操作是()。 A、查找和修改 B、查找和索引 C、索引和修改 D、建立和删除 解析: (A) 基本操作是查找和修改,其中每个元素都可以通过其索引来访问,这是从数组的第一个元素开始计算的。除了访问和修改数组元素之外,还可以执行其他一些操

    2024年02月12日
    浏览(31)
  • 数据结构——线性数据结构(数组,链表,栈,队列)

    数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。 数组的特点是: 提供随机访问 并且容量有限。 2.1. 链表简介 链表(LinkedList) 虽然是

    2024年02月11日
    浏览(44)
  • Java 数据结构篇-用链表、数组实现队列(数组实现:循环队列)

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 队列的说明         1.1 队列的几种常用操作         2.0 使用链表实现队列说明         2.1 链表实现队列         2.2 链表实现队列 - 入栈操作         2.3 链表实现队

    2024年02月05日
    浏览(40)
  • 线性数据结构:数组、受限数组(栈、队列)、线性表

      数组(Array)是有序的元素序列。属于线性结构(有且仅有一个前驱、有且仅有一个后继)。   数组的关键在于在内存中的物理地址对应的是 一段连续的内存 。这意味着如果想要在任意位置删除/新增一个元素,那么该位置往后的所有元素,都需要往前挪/往后挪一个位

    2024年03月09日
    浏览(52)
  • 【数据结构】数组实现队列(详细版)

    目录 队列的定义 普通顺序队列的劣势——与链队列相比  顺序队列实现方法: 一、动态增长队列  1、初始化队列  2、元素入队  3、判断队列是否为空  4、元素出队  5、获取队首元素 6、获取队尾元素  7、获取队列元素个数 8、销毁队列  总结: 动态增长队列完整测试代

    2024年04月28日
    浏览(35)
  • 数据结构_栈、队列和数组

    目录 1. 栈 1.1 栈的定义 1.2 栈的基本操作 1.3 栈的顺序存储结构 1.3.1 顺序栈 1.3.2 顺序栈的基本运算 1.3.3 共享栈 1.4 栈的链式存储 1.5 栈相关应用 2. 队列 2.1 队列的定义 2.2 队列的基本操作 2.3 队列的顺序存储 2.4 循环队列 2.4.1 循环队列的操作 2.5 队列的链式存储 2.5.1 链式队列的

    2024年02月04日
    浏览(44)
  • 【数据结构】——多维数组、矩阵以及广义表的相关习题

    1、数组通常具有的两种基本操作是()。 A、查找和修改 B、查找和索引 C、索引和修改 D、建立和删除 解析: (A) 基本操作是查找和修改,其中每个元素都可以通过其索引来访问,这是从数组的第一个元素开始计算的。除了访问和修改数组元素之外,还可以执行其他一些操

    2024年02月04日
    浏览(37)
  • 数据结构:队列(链表和数组模拟实现)

    目录 1.何为队列 2.链表模拟实现 2.1 节点和队列创建 2.2 初始化队列 2.3 入队操作 2.4 出队操作 2.5 遍历队列 2.6 获取队首和队尾元素 2.7 判断队列是否为空 2.8 完整实现 3. 数组模拟实现 3.1 创建队列 3.2 入队和出队操作 3.3 遍历队列 3.4 获取队首和队尾元素  3.5 判断队列是否为空

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包