温故而知新 -> 数据结构 ->利用 栈 实现 队列 -> 程序实现2_利用类

温故而知新 -> 数据结构 ->利用 栈 实现 队列 -> 程序实现2_利用类

本篇博客是基于 温故而知新 -> 数据结构 -> 线性表 ->队列 && 栈 中利用 栈 实现 队列 的理论知识进行程序实现!

其中结合了 温故而知新->数据结构->栈->程序实现2_利用类 中的代码,实现了队列的 (入队)(出队)(队头与队尾元素)改(没写(~ ̄▽ ̄)~),判空,打印等操作!并附带了实例以及对应的运行结果!

注意:其中代码多多少少有点冗余,且未考虑性能最优,读者有兴趣可进一步精简!

具体内容如下
(1)SQueue.h


#pragma once
#include<iostream>
using namespace std;
#include<assert.h>


typedef int STDataType;
class stack
{
public:
	stack() :_val(nullptr)
		, _size(0)
		, _capa(0)
	{}

	~stack()
	{
		if (_val != nullptr)
		{
			free(_val);
			_val = NULL;
			_size = _capa = 0;
		}
	}

	// 检查栈容量
	void checkCapacity();
	// 插入 - 入栈 (相当于是尾插)
	void stackPush(STDataType val);
	// 删除 - 出栈 (相当于是尾删)
	void stackPop();

	// 元素个数
	int stackSize();
	// 判空
	bool stackEmpty();

	// 获取栈顶元素 -- 直接返回数据即可
	STDataType stackTop();
	// 栈内元素打印
	void stackPrint();
private:
	STDataType *_val;
	int _size;
	int _capa;
};

class SQueue:public stack
{
public:
	SQueue()
	{
		enSta = new stack();
		deSta = new stack();
	}
	~SQueue()
	{
		delete(enSta);
		delete(deSta);
	}

	// 队尾入队列
	void SQueuePush(STDataType data);
	// 队头出队列
	void SQueuePop();
	// 打印队列
	void SQueuePrint();
	// 获取队列头部元素
	STDataType SQueueFront();
	// 获取队列队尾元素
	STDataType SQueueRear();
	// 获取队列中有效元素个数
	int SQueueSize();
	// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
	bool SQueueEmpty();

private:
	stack *enSta;//入队栈
	stack *deSta;//出队栈
};

(2)main.cpp

/* 利用栈实现队列 */
#include"SQueue.h"

/* 先是对stack中函数的定义 */
// 检查栈容量
void stack::checkCapacity()
{
	if (_size == _capa)
	{
		int newCapa = _capa == 0 ? 1 : 2 * _capa;
		_val = (STDataType*)realloc(_val, newCapa*sizeof(STDataType));
		_capa = newCapa;
	}
}
// 插入 - 入栈 (相当于是尾插)
void stack::stackPush(STDataType val)
{
	//assert(_val != NULL);
	stack::checkCapacity();
	_val[_size] = val;
	_size++;
}
// 删除 - 出栈 (相当于是尾删)
void stack::stackPop()
{
	assert(_val != NULL || _size == 0);
	_size--;
}

// 元素个数
int stack::stackSize()
{
	return _size;
}
// 判空
bool stack::stackEmpty()
{
	if (_val == NULL || _size == 0)
	{
		//cout << "空栈" << endl;
		return true;
	}
	else
	{
		//cout << "非空栈" << endl;
		return false;
	}
}

// 获取栈顶元素 -- 直接返回数据即可
STDataType stack::stackTop()
{
	return _val[_size - 1];
}
// 栈内元素打印,遵循先进后出原则
void stack::stackPrint()
{
	assert(_val != NULL);
	int i = _size - 1;
	//cout << "栈内元素:";
	while (i >= 0)
	{
		cout << _val[i--] << " ";
	}cout << endl;
}

/* 对SQueue类中函数进行定义*/
// 队尾入队列
void SQueue::SQueuePush(STDataType data)
{
	enSta->stackPush(data);
}
// 队头出队列
void SQueue::SQueuePop()
{
	if (deSta != NULL)
		deSta->stackPop();
	else
	{
		//将入队栈的所有数据存入出队栈
		while (enSta != NULL)
		{
			deSta->stackPush(enSta->stackTop());
			enSta->stackPop();
		}
		//删除出队栈的栈顶即完成了队列的出队操作
		deSta->stackPop();
	}
}
// 打印队列
void SQueue::SQueuePrint()
{
	if (enSta->stackEmpty() && deSta->stackEmpty())//判断入队栈与出队栈是否都为空
		return;
	//此时三种情况:
	//	1、入队栈有数据,出队栈为空 -- 打印时候,先输入的应该在前,代表队头
	//	2、入队栈为空,出队栈有数据 -- 打印时候,正常打印,因为出队栈的栈顶代表了队头
	//	3、两个栈都有数据 -- 先打印出队栈,再逆向打印入队栈
	cout << "队列元素:";
	if (!enSta->stackEmpty() && deSta->stackEmpty())
	{
		//一个简单办法,将入队栈数据存入出队栈,然后打印出队栈数据即可
		while (!enSta->stackEmpty())
		{
			deSta->stackPush(enSta->stackTop());
			enSta->stackPop();
		}
		deSta->stackPrint();
	}
	else if (enSta->stackEmpty() && !deSta->stackEmpty())
	{
		deSta->stackPrint();
	}
	else 
	{
		//此时实现办法较多,比如用一个中间变量,保存入队栈的数据,然后打印完,再存入入队栈
		deSta->stackPrint();
		stack *tmp = new stack();
		while (!enSta->stackEmpty())
		{
			tmp->stackPush(enSta->stackTop());
			enSta->stackPop();
		}
		tmp->stackPrint();
		while (!tmp->stackEmpty())
		{
			enSta->stackPush(tmp->stackTop());
			tmp->stackPop();
		}
		delete(tmp);//用new创建的对象指针,需要用delete进行释放
	}
}
// 获取队列头部元素
STDataType SQueue::SQueueFront()
{
	if (enSta->stackEmpty() && deSta->stackEmpty())//判断入队栈与出队栈是否都为空
		return NULL;
	if (!enSta->stackEmpty() && deSta->stackEmpty())
	{
		//一个简单办法,将入队栈数据存入出队栈,然后打印出队栈数据即可
		while (!enSta->stackEmpty())
		{
			deSta->stackPush(enSta->stackTop());
			enSta->stackPop();
		}
	}
	return deSta->stackTop();
}
// 获取队列队尾元素
STDataType SQueue::SQueueRear()
{
	if (enSta->stackEmpty() && deSta->stackEmpty())//判断入队栈与出队栈是否都为空
		return NULL;
	if (!enSta->stackEmpty())
	{
		return deSta->stackTop();
	}
	else
	{
		//此时入队栈为空,出队栈有数据,所以此时的队尾元素相当于出队栈的栈底元素,为获得栈底元素,
		//先将出队栈中的数据存入入队栈,获得栈底元素后,再把入队栈中的数据存至出队栈
		while (!deSta->stackEmpty())
		{
			enSta->stackPush(deSta->stackTop());
			deSta->stackPop();
		}
		STDataType tmp = enSta->stackTop();
		while (!enSta->stackEmpty())
		{
			deSta->stackPush(enSta->stackTop());
			enSta->stackPop();
		}
		return tmp;
	}
	
}
// 获取队列中有效元素个数
int SQueue::SQueueSize()
{
	return enSta->stackSize() + deSta->stackSize();
}
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0
bool SQueue::SQueueEmpty()
{
	return enSta->stackEmpty() && deSta->stackEmpty();
}

void test()
{
	SQueue sq;
	/* 实验入队操作 */
	sq.SQueuePush(1);
	sq.SQueuePush(2);
	sq.SQueuePush(3);
	sq.SQueuePush(4);
	sq.SQueuePrint();// 1 2 3 4
	cout << endl;

	/* 实验出队操作 */
	sq.SQueuePop();
	sq.SQueuePrint();// 2 3 4
	sq.SQueuePop();
	sq.SQueuePrint();// 3 4
	//sq.SQueuePop();
	//sq.SQueuePrint();// 4
	//sq.SQueuePop();
	//sq.SQueuePrint();//会没有值打印,因为此时队内元素为空
	cout << endl;

	/* 实验队头元素 */
	cout << "此时队头元素为:" << sq.SQueueFront() << endl;
	/* 实验队尾元素 */
	cout << "此时队尾元素为:" << sq.SQueueRear() << endl;
	cout << endl;

	/* 实验元素个数 */
	cout << "此时有效元素个数:" << sq.SQueueSize() << endl;
	cout << endl;

	/* 实验是否为空 */
	cout << "此时队列状态(0:非空,1:空):" << sq.SQueueEmpty() << endl;
}

int main()
{
	test();
	system("pause");
	return 0;
}

(3)运行结果
在这里插入图片描述
以上为本篇博客内容,若有问题,欢迎与笔者交流!
侵权删~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1 University students can understand innovation through learning from the past. 2. Students can better review by breaking down complex concepts into smaller components and studying the material in an organized way. 3. When learning from the past to understand innovation, it is important to focus on understanding the big picture and to not get bogged down in the details. ### 回答2: 1. 大学生如何理解故而故而是一种学习方法,它要求我们在学习识之前先回顾和巩固已经学过的识。大学生理解故而意味着要在学习识之前,先回顾和复习以前学过的相关识或基础识。通过故,我们能够加深对已有识的理解和记忆,从而更好地理解和掌握识。 2. 学生如何更好地去复习? 学生要更好地复习,可以采取以下策略: 首先,制定一个合理的复习计划,将要复习的内容分配到不同的时间段,确保每个科目都有足够的时间。 其次,采用多种复习方法,如阅读教材、做练习题、参加讨论等,以帮助加深理解和牢固记忆。 另外,与同学或老师一起讨论复习内容,通过讲解和互动来加深理解。 此外,保持良好的学习习惯,比如及时复习、做好笔记等,能够帮助学生更好地掌握和复习识。 3. 故而的过程需要注意什么? 在故而的过程中,需要注意以下几点: 首先,要有针对性,根据自己的学习需求和复习目标,选择性地回顾和复习相关识点。 其次,要有系统性,将复习内容进行分类整理,形成一个清晰的识框架,有助于加深理解和记忆。 另外,要关注重难点,重点复习那些相对较难或容易遗忘的识点,加强对这些内容的学习和理解。 还要有耐心和恒心,故而是一个持续的过程,需要长期坚持和不断巩固。 最后,要善于总结和归纳,通过整理和回顾复习过程中的笔记和练习,提炼出关键概念和思维模式,便于记忆和应用。 ### 回答3: 1. 大学生如何理解故而? 大学生可以理解为通过回顾过去的识和经验,来获取的见解和理解。故是指回顾已经学过的识,了解其中的原理、概念和重要点。而则是指通过对识的学习,扩展和更自己的识体系。故而相辅相成,是一个持续学习和发展的过程。 2. 学生如何更好地去复习? 学生可以通过以下方式更好地进行复习: - 制定合理的复习计划:根据时间安排和课程难度,合理分配复习时间,确保每个学科都有足够的复习时间。 - 多种复习方法结合:采用不同的学习方式,如阅读教材、做练习题、参与讨论、制作思维导图等,帮助巩固记忆和理解识。 - 主动参与课堂:积极参与讨论和提问,与同学和老师交流,加深对识的理解和记忆。 - 不断反思和总结:及时检查自己的复习情况,发现不足和问题,并及时调整学习方法和计划。 3. 故而的过程需要注意什么? 在故而的过程中,学生需要注意以下几点: - 有目的性地故:针对具体的识点或者问题进行回顾,明确自己的学习目标和重点。 - 理解和记忆结合:不仅要理解概念和原理,还要通过多次的复习和记忆,帮助信息在大脑中形成长期记忆。 - 理论联系实际:将学到的识应用到实际情境中,加深对识的理解和记忆。 - 及时巩固复习成果:通过做练习题、整理笔记、与同学讨论等方式,巩固复习的成果,确保识掌握得更牢固。 - 长期持续学习:故而是一个持续的过程,要保持学习的热情和动力,不断更自己的识体系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值