数据结构——栈和队列的相互模拟

栈的相关知识点详见:

数据结构------顺序栈及函数实现(C语言)-CSDN博客https://blog.csdn.net/wy_05136/article/details/159966034?spm=1001.2014.3001.5501数据结构------链栈的设计及函数实现(C语言)-CSDN博客https://blog.csdn.net/wy_05136/article/details/160087600?spm=1001.2014.3001.5501队列的相关知识点详见:

数据结构------链队列的设计及函数实现(C语言)-CSDN博客https://blog.csdn.net/wy_05136/article/details/160090401?spm=1001.2014.3001.5501数据结构------循环队列的设计及函数实现(C语言)-CSDN博客https://blog.csdn.net/wy_05136/article/details/160229473?spm=1001.2014.3001.5501


栈 的特点:先进后出

队列 的特点:先进先出

一、用两个栈实现队列

(一)准备两个栈

S1:入队栈,所有的入队操作直接压入S1

S2:出队栈,负责出队

(二)规则

1.入队:无脑向S1插入元素

2.出队:如果S2不为空,直接从S2拿出一个元素;如果S2为空,说明剩余元素都在S1中,此时需要将S1中的所有元素全部誊到S2中,此时S2不再为空,直接从S2拿出一个元素即可。

(三)C++实现

1.两个栈实现队列的结构体

cpp 复制代码
#include <string.h>
#include <assert.h>
#include <memory.h>

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

typedef struct TwoStack_toQueue {
	std::stack<int> S1;  //入队栈
	std::stack<int> S2;  //出队栈
}TwoStack_toQueue;

2.入队

cpp 复制代码
bool TSQPush(TwoStack_toQueue* ptsq, int val) {
	assert(ptsq != NULL);

	//入队规则:无脑的向s1插入
	ptsq->S1.push(val);
	return true;
}

3.出队

cpp 复制代码
bool TSQPop(TwoStack_toQueue* ptsq) {
	assert(ptsq != NULL);
	assert(!ptsq->S1.empty() || !ptsq->S2.empty());//队列不能为空:s1和s2不能同时为空

	//如果s2为空,需要先将s1的所有元素誊到s2
	if (ptsq->S2.empty()) {
		while (!ptsq->S1.empty()) {
			ptsq->S2.push(ptsq->S1.top());
			ptsq->S1.pop();
		}
	}

	//直接从s2出队
	ptsq->S2.pop();

	return true;
}

二、用两个队列实现栈

(一)准备两个队列:Q1、Q2

(二)规则

1.入队:无脑向Q1插入元素

2.出队

情况一 :首先去观察Q1空不空,如果Q1不空,则说明我们要删除的最新的插入的值一定在Q1的队尾;则将Q1中除最后一个元素之外的其他元素誊给Q2,最后再将Q1仅剩下的元素删掉即可;
情况二:如果Q1为空,则说明我们的删除的最新的插入值一定在Q2的队尾;则重复上述操作,将Q2的最后一个元素保留,其他挪动给Q1,然后Q2仅剩下的这个元素删除即可

(三)C++实现

1.两个队列实现栈的结构体

cpp 复制代码
typedef struct TwoQueue_toStack {
	std::queue<int> Q1;
	std::queue<int> Q2;
}TwoQueue_toStack;

2.入栈

cpp 复制代码
bool TQS_Push(TwoQueue_toStack* ptsq, int val) {
	assert(ptsq != NULL);

	ptsq->Q1.push(val);

	return true;
}

3.出栈

cpp 复制代码
bool TQS_Push(TwoQueue_toStack* ptsq) {
	assert(ptsq != NULL);
	assert(!ptsq->Q1.empty() || !ptsq->Q2.empty());//栈不能为空:Q1和Q2不能同时为空
    
    //若Q1非空,将Q1中除最后一个元素之外的其他元素誊给q2,最后再将Q1仅剩下的元素删掉
	if (!ptsq->Q1.empty())
	{
		int Size_Q1 = ptsq->Q1.size(); //Q1的元素个数
    
        //将除最后一个外的元素,全部誊到Q2
		for (int i = 0; i < Size_Q1 - 1; i++) {
			ptsq->Q2.push(ptsq->Q1.front());
			ptsq->Q1.pop();
		}
    
        //删除Q1仅剩的元素
		ptsq->Q1.pop();

		return true;
	}
    
    //若Q1为空,重复上述操作,只不过Q1和Q2颠倒过来
	else {
		int Size_Q2 = ptsq->Q2.size();

		for (int i = 0; i < Size_Q2 - 1; i++) {
			ptsq->Q1.push(ptsq->Q2.front());
			ptsq->Q2.pop();
		}

		ptsq->Q2.pop();

		return true;
	}
}
相关推荐
字节跳动的猫7 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构
上位机妹子7 小时前
C 语言 数组删除指定元素(快慢指针法)
c语言·数据结构·算法
C++ 老炮儿的技术栈10 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
keyipatience11 小时前
跳表详细解析
开发语言·数据结构·c++·算法·跳表
小小、码农11 小时前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统
INGNIGHT13 小时前
1897 · 会议室 3(扫描线)
数据结构·算法
All for pursuit.13 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
Logic10116 小时前
C语言/数据结构字符串题解:按字符类型重排(数字→字母→符号)——三趟扫描稳定分区
c语言·数据结构·字符串·时间复杂度·计数排序·算法题·ascii
Logic1011 天前
C语言/数据结构位运算题解:异或XOR找出学习计划中的“独特学习时间“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
小蒋学算法1 天前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法