首页 > 其他分享 >栈实现队列

栈实现队列

时间:2023-04-13 12:12:08浏览次数:49  
标签:ps obj pushst 队列 popst 实现 MyQueue stack

用两个栈实现队列

题目链接

 

思路

首先, 梳理下栈和队列的概念, 如下图

栈中所有数据遵循后入先出, 而队列是先入先出

然后, 理解用两个栈模拟出的队列结构

最后思考如何用模拟出的队列实现入队, 出队, 取队头数据和判空操作, 这里说一下我的思路

入队: 入pushst栈

出队: 将pushst栈中的所有数据依次导入进popst栈中, 这样将popst栈顶数据出栈就实现了出队

取队头数据: 与出队类似,导入popst, 取popst栈顶数据就是取队头数据 

判空: 如果两个栈都为空,则队列为空

下面代码实现

typedef int STDataType;
typedef struct stack
{
	STDataType* dys;
	int capacity;
	int top;
}stack;

// 初始化
void STInit(stack* ps);
// 销毁
void STDestroy(stack* ps);
// 入栈
void STPush(stack* ps, STDataType data);
// 出栈
void STPop(stack* ps);
// 取栈顶数据
STDataType STTop(stack* ps);
// 计算数据个数
int STSize(stack* ps);
// 判空
bool isSTEmpty(stack* ps);
// 初始化
void STInit(stack* ps)
{
	assert(ps);
	STDataType* tmp = (STDataType*)malloc(sizeof(STDataType) * 3);
	if (NULL == tmp)
	{
		perror("STInit::malloc fail");
		return;
	}
	ps->dys = tmp;
	ps->capacity = 3;
	ps->top = 0;
}
// 销毁
void STDestroy(stack* ps)
{
	assert(ps);
	free(ps->dys);
	ps->dys = NULL;
	ps->capacity = 0;
	ps->top = 0;
}
// 入栈
void STPush(stack* ps, STDataType data)
{
	assert(ps);
	if (ps->top == ps->capacity)
	{
		STDataType* tmp = (STDataType*)realloc(ps->dys, sizeof(STDataType) * ps->capacity * 2);
		if (NULL == tmp)
		{
			perror("STPush::realloc fail");
			return;
		}
		ps->dys = tmp;
		ps->capacity *= 2;
	}
	ps->dys[ps->top] = data;
	ps->top++;
}
// 出栈
void STPop(stack* ps)
{
	assert(ps);
	assert(!isSTEmpty(ps));
	ps->top--;
}
// 取栈顶数据
STDataType STTop(stack* ps)
{
	assert(ps);
	assert(!isSTEmpty(ps));
	return ps->dys[ps->top - 1];
}
// 计算数据个数
int STSize(stack* ps)
{
	assert(ps);
	return ps->top;
}
// 判空
bool isSTEmpty(stack* ps)
{
	assert(ps);
	return ps->top == 0;
}

typedef struct {
    stack pushst;
    stack popst;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&obj->pushst);
    STInit(&obj->popst);
    return obj;
}

void myQueuePush(MyQueue* obj, int x) {
    STPush(&obj->pushst, x);
}

int myQueuePop(MyQueue* obj) {
    if (isSTEmpty(&obj->popst))
    {
        // 导入
        while (!isSTEmpty(&obj->pushst))
        {
            STPush(&obj->popst, STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }
    int front = STTop(&obj->popst);
    STPop(&obj->popst);
    return front;
}

int myQueuePeek(MyQueue* obj) {
    if (isSTEmpty(&obj->popst))
    {
        // 导入
        while (!isSTEmpty(&obj->pushst))
        {
            STPush(&obj->popst, STTop(&obj->pushst));
            STPop(&obj->pushst);
        }
    }
    return STTop(&obj->popst);
}

bool myQueueEmpty(MyQueue* obj) {
    return isSTEmpty(&obj->popst) && isSTEmpty(&obj->pushst);
}

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->popst);
    STDestroy(&obj->pushst);
    free(obj);
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

标签:ps,obj,pushst,队列,popst,实现,MyQueue,stack
From: https://www.cnblogs.com/xumu11291/p/17314202.html

相关文章

  • Nuxtjs实现服务端渲染和静态化站点
    本文将介绍如何使用Nuxtjs对vue项目进行ssr和静态化处理。Nuxtjs简单介绍首先,我们简单了解下Nuxtjs框架,Nuxt.js是一个基于Vue的通用框架,主要用于解决Vue项目的服务端渲染(SSR)。它本质上是一个Vue框架,增加一层node服务,通过对客户端/服务端的抽象封装,使用Nuxt各种资源配置,处理服......
  • js中无需点击就可以实现页面跳转
    js中无需点击就可以实现页面跳转第一种:复制代码代码如下:<scriptlanguage="javascript"type="text/javascript">window.location.href="xx.jsp?backurl="+window.location.href;</script>第二种:复制代码代码如下:<scriptlanguage="javascript......
  • oracle中if/else的三种实现方式详解
    oracle中if/else的三种实现方式详解1、标准sql规范1、单个IFIFv=...THENENDIF;2、IF...ELSEIFv=...THENELSEt....;ENDIF;3、多个IFIFv=...THENELSIFv=...THENt...;ENDIFL注意:多个IF的是'ELSIF'不是'ELSEIF'2、decode函数DECODE(VALUE,IF......
  • 基于Java+uniapp小程序实现餐厅校园订餐平台
    基于Java+Vue+uniapp微信小程序实现餐厅校园订餐平台博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域一、前言介绍:传统的校园订餐管理方式都在使用手工记录的方式进行数据的登记,这种方式耗时,而且对于数据量比较大的情况想......
  • 基于Java+Springboot+vue网上商品订单转手系统设计和实现
    基于Java+Springboot+vue网上商品订单转手系统设计和实现一、前言介绍:1.1项目摘要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装网上商品订单转手系统软件来发挥其高效地信息处理......
  • c语言贪吃蛇(1)地图实现
    采用循环输出来实现按照行和列的顺序两次for循环输出。代码:结果: ......
  • 自动驾驶技术的加速发展:智能交通和智慧城市的实现
    ​ 自动驾驶技术的加速发展是当今科技领域的热门话题之一。随着人工智能技术的不断进步,自动驾驶技术已经逐渐成为现实。自动驾驶技术的发展不仅可以提高交通效率,还可以实现智慧城市的建设。自动驾驶技术的发展离不开智能交通的支持。智能交通是指利用现代信息技术和通信技术,对交......
  • JAVA 用 List 实现堆
    大顶堆:每个父节点都大于子节点小顶堆:每个父节点都小于子节点在堆中,每次加入元素或者移除元素,都要调整堆的位置,使其满足堆的定义。常用于topK问题,k个最大/最小元素,每次弹出大顶堆/小顶堆堆顶元素即可。以及堆排序问题,堆排序可以看成是将待排序的数组元素依次加入堆(每次加入......
  • 使用shell,python,go来实现ansible的自定义模块
    一、自定义模块运行原理二、自定义模块实战2.1shell方式2.2python方式2.3golang方式三、测试验证3.1shell方式验证3.2python方式验证3.3golang方式验证ansible已经提供了非常多的模块,涵盖了系统、网络、数据库、容器、以及其他的方方面面的领域,几乎可以不用重复......
  • 3.【RabbitMQ实战】- 工作队列(Work Queue)
    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。轮询分发消息......