用队列实现栈+用栈实现队列+循环队列(oj题)

news2024/11/13 16:08:01

1.题目:

 

力扣https://leetcode.cn/problems/implement-stack-using-queues/

思路:

核心思路:
1、入数据,往不为空的队列入、保持另一个队列为空
2、出数据的时候,依次出队头的数据,转移另一个队列保存。只剩最后一个事,Pop掉


typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QueueNode;

typedef struct Queue
{
	QueueNode* head;
	QueueNode* tail;
}Queue;

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QueueNode* cur = pq->head;// QueueNode* cur =NULL
	while (cur != NULL)
	{
		QueueNode* next = cur->next;
		free(cur);
		cur = next;
	}

	pq->head = pq->tail = NULL;
}
QueueNode* BuyQueueNode(QDataType x)
{
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QueueNode* newnode = BuyQueueNode(x);
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}
void QueuePrint(Queue* pq)
{
	QueueNode* cur = pq->head;
	while (cur)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");

}
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}
void QueuePop(Queue* pq)
{
	assert(pq);
	//if (pq->head == NULL)
	//	return;
	assert(!QueueEmpty(pq));

	QueueNode* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	if (pq->head == NULL)
	{
		pq->tail = NULL;
	}
}

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->data;
}

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->data;
}

int QueueSize(Queue* pq)
{
	assert(pq);

	int n = 0;
	QueueNode* cur = pq->head;
	while (cur)
	{
		++n;
		cur = cur->next;
	}

	return n;
}


//以上为队列的基本功能,下面才是解题主体部分






typedef struct 
{
    Queue q1;//第一个队列
    Queue q2;//第二个队列
} MyStack;


MyStack* myStackCreate() 
{
    MyStack*st=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&st->q1);
    QueueInit(&st->q2);
    return st;
}

void myStackPush(MyStack* obj, int x) 
{
    //往不为空的队列入
    if(!QueueEmpty(&obj->q1))
    {
        QueuePush(&obj->q1,x);
    }
    else
    {
        QueuePush(&obj->q2,x);
    }
}

int myStackPop(MyStack* obj)
{
    Queue*emptyQ=&obj->q1;//空队列
    Queue*nonemptyQ=&obj->q2;//非空队列
    if(!QueueEmpty(&obj->q1))
    {
        emptyQ=&obj->q2;
        nonemptyQ=&obj->q1;
    }

    while(QueueSize(nonemptyQ)>1)
    {
        QueuePush(emptyQ,QueueFront(nonemptyQ));
        QueuePop(nonemptyQ);
    }//非空队列的数据放入空队列中,只留下一个数据
    int top=QueueFront(nonemptyQ);
    QueuePop(nonemptyQ);
    return top;

}

int myStackTop(MyStack* obj) 
{
     //获取非空队列的队尾数据
  if (!QueueEmpty(&obj->q1))
  {
    return QueueBack(&obj->q1);
  }
  else
  {
    return QueueBack(&obj->q2);
  }
}

bool myStackEmpty(MyStack* obj) 
{
    //两个队列均为空,则MyStack为空
  return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

void myStackFree(MyStack* obj) 
{
    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);;

}

/**
 * Your MyStack struct will be instantiated and called as such:
 * MyStack* obj = myStackCreate();
 * myStackPush(obj, x);
 
 * int param_2 = myStackPop(obj);
 
 * int param_3 = myStackTop(obj);
 
 * bool param_4 = myStackEmpty(obj);
 
 * myStackFree(obj);
*/

 2.题目

力扣https://leetcode.cn/problems/implement-queue-using-stacks/思路:

创建两个栈,一个栈插入数据pushST,另一个栈删除数据popST。

  • 当要插入数据时,往pushST插就行
  • 当要删除数据时,满足先进先出的条件.可以把pushST的数据放到popST,然后再把popST数据输出就可以了

  

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);



void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = 0; // ps->top = -1;
	ps->capacity = 0;
}

void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}

void StackPush(ST* ps, STDataType x)
{
	assert(ps);

	if (ps->top == ps->capacity)
	{
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = realloc(ps->a, sizeof(STDataType)*newCapacity);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity = newCapacity;
	}

	ps->a[ps->top] = x;
	ps->top++;
}

void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	ps->top--;
}

STDataType StackTop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top - 1];
}

int StackSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

bool StackEmpty(ST* ps)
{
	assert(ps);

	/*if (ps->top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}*/
	return ps->top == 0;
}

//以上代码是栈的基本功能实现,以下代码是解题主体部分




typedef struct 
{
    ST pushST;//插入数据的栈
    ST popST;//删除数据的栈
} MyQueue;


MyQueue* myQueueCreate() 
{
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&obj->pushST);//插入数据的栈的初始化
    StackInit(&obj->popST);//删除数据的栈的初始化
    return obj;
}

void myQueuePush(MyQueue* obj, int x) 
{
    StackPush(&obj->pushST,x);//插入数据
}

bool myQueueEmpty(MyQueue* obj) 
{
     return StackEmpty(&obj->pushST)&&StackEmpty(&obj->popST);//两个栈均为空,则“队列”为空
}

int myQueuePeek(MyQueue* obj) 
{
    // 如果popST中没有数据,将pushST的数据导过去
    // popST中的数据就符合先进先出的顺序了
     if(StackEmpty(&obj->popST))//popST为空时,需先将pushST中数据导入popST
    {
        while(!StackEmpty(&obj->pushST))//将pushST数据全部导入popST
        {
            StackPush(&obj->popST, StackTop(&obj->pushST));
            StackPop(&obj->pushST);
        }
    }
    return StackTop(&obj->popST);//返回popST栈顶的元素

}

int myQueuePop(MyQueue* obj) 
{
    // 如果popST中没有数据,将pushsT的数据导过去
    // popST中的数据就符合先进先出的顺序了
    int top=myQueuePeek(obj);
    StackPop(&obj->popST);//删除数据
    return top;
}



void myQueueFree(MyQueue* obj) 
{
    //先释放两个栈,再释放队列的结构体类型
    StackDestroy(&obj->pushST);
    StackDestroy(&obj->popST);
    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);
*/

 3.题目

力扣https://leetcode.cn/problems/design-circular-queue/

 后面在更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构之排序系列】校招热门考点:快速排序

目录前言一、hoare版本1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试二、挖坑法1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试三、前后指针法1. 单排2. 单排的代码实现3. 综合排序的实现4. 测试四、快排的时间复杂度五、快排的优化1. 三数取中2. 小区间优化六、快排的…

[Vulnhub] DC-9

前言: 打了这么长时间,终于,DC系列1-9 靶机已经干完了。通过这九个靶机的历练,都是单靶机 感觉远远不足,但也不是没有收获,学到了一些工具和提权的简单利用,大概知道了什么是反弹shell&#xf…

UE实现人物角色沿样条线移动效果

文章目录 1.实现目标2.实现过程2.1 实现思路2.2 具体过程3.参考资料1.实现目标 实现人物角色Character按样条线Spline自动移动效果,GIF动图如下。 2.实现过程 2.1 实现思路 (1)获取某一时刻样条线上点的位置,直接使用GetLocationAtTime函数即可。 (2)实时更新Characte…

Python Windows Apache部署Django项目运行环境(含Mysql)以及解决过程中遇到的问题

上一篇请移步Python Windows Apache部署Django项目运行环境_水w的博客-CSDN博客 本文是在上一篇的基础上, 进行后续工作。 目录 一、配置数据库(MySQL) 1、Mysql配置 2、安装MySQL管理工具SQLyog 【解决过程中遇到的问题】 解决报错&am…

java泛型2

真正搞定泛型!!!------- >类型形参 所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参(或叫泛型)将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类…

【看表情包学Linux】进程的概念 | 进程控制块 PCB | 父进程与子进程 | 进程 ID | task_struct

🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅 🔥 💭 写在前面:本章我们将带着大家深入理解 "进程" 的概念,"进程" 这个概念其实使我们一直在接触的东西,只不…

一文深入搞懂 mmap 涉及的所有内容

内存映射,简而言之就是将内核空间的一段内存区域映射到用户空间。映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间与用户空间两者之间需要大量数…

一文讲清同步异步,消息队列,宏任务 微任务...

单线程多线程 什么是线程进程? 进程:是cpu分配资源的最小单位;(是能拥有资源和独立运行的最小单位) 线程: 是cpu调度的最小单位;(线程是建立在进程的基础上的一次程序运行单位,一…

Kafka第一章:环境搭建

系列文章目录 Kafka第一章:环境搭建 文章目录系列文章目录前言一、环境安装1.前置环境2.软件下载3.上传集群并解压4.编写配置文件5.分发配置文件6.修改参数7.环境变量8.启动服务9.编写启动脚本二、主题命令行操作1.查看topic2.创建 first topic3.查看主题的详情4.修…

录制屏幕为什么没有声音?教您录制声画同步的视频

有时我们只顾着录制电脑的画面,而忽视了录制视频的声音,导致录制的视频文件只有画面没有声音。那您知道录制的视频为什么没有声音吗?怎样才能录制声画同步的录屏文件呢?想要录制带声画同步的视频,首先您得拥有一款支持…

[kubernetes]-k8s通过psp限制nvidia-plugin插件的使用

导语: k8s通过psp限制nvidia-plugin插件的使用。刚开始接触psp 记录一下 后续投入生产测试了再完善。 通过apiserver开启psp 静态pod会自动更新 # PSP(Pod Security Policy) 在默认情况下并不会开启。通过将PodSecurityPolicy关键词添加到 --enbale-admission-plu…

【Cocos新手入门】使用 cocos creator 创建多个场景,并通过代码和事件绑定进行切换场景的方法

本篇文章主要讲解使用 cocos creator 创建多个场景,并通过代码和事件绑定进行切换 作者:任聪聪 日期:2023年1月31日 cocos 引擎版本 2.4.3 场景的创建 步骤一、右击资源管理器下的assets目录,点击新建,献出案件一个sc…

NX二开ufun函数UF_MODL_create_section_surface(样条曲线构建截面特征)

本节主要介绍通过样条曲线及截面OPEN API结构体构建截面特征,函数名 UF_MODL_create_section_surface,效果图如下: 1、函数结构 int UF_MODL_create_section_surface ( UF_MODL_secsrf_data_p_t section_surface_data&#xff0c…

vue2 数据响应式Object.defineProperty

我们通常可以对进行输入框进行数据的监听,只需要用到了input 事件或 change事件,就可以实时监听到数据的改变,但是如果只是一个单独的数据呢?怎么去做监听,watch吗??哈哈。 所以 vue响应式就用…

基于微信小程序的懒人美食帮小程序

文末联系获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7/8.0 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.…

graalvm把springboot 3.0应用编译为原生应用

文章目录1、GraalVM Native Support依赖2、编译为原生应用2.1、编译为docker镜像2.2、编译为原生应用文件之前的文章《Graalvm 安装和静态编译(https://blog.csdn.net/penngo/article/details/128006244)》介绍了graalvm的安装和环境配置,普通…

【Rust】6. 结构体与方法

6.1 结构体的定义和实例化 6.1.1 结构体定义、创建实例 6.1.2 创建实例:字段初始化简写语法 6.1.3 创建实例:结构体更新语法(注意:数据的移动特性!) .. 语法:指定了剩余未显式设置值的字段应有…

通信原理笔记—差分脉冲编码调制

目录 差分脉冲编码调制(DPCM): 预测编码: 预测编码的基本原理: 信号预测的基本方法: ΔPCM与DPCM的主要区别: 差分脉冲编码调制(DPCM): 实际信源的特点:实际信源大都是有记忆的信源:信源的相邻输出符号间(如&…

无广告,小体积,实用性拉满的5款软件

人类与99%的动物之间最大差别在于是否会运用工具,借助好的工具,能提升几倍的工作效率。 1. 无损放大图片——Bigjpg 大杀器!深度卷积神经网络实现噪点和锯齿部分补充,从而达到图片无损放大。图片边缘也不会有毛刺和重影,。更重要…

(深度学习快速入门)第四章第二节:什么是卷积神经网络

文章目录一:为什么DNN不适合图像处理(1)图像的空间信息被丢失(不具备空间不变性)(2)参数爆炸二:什么是卷积神经网络三:CNN应用一:为什么DNN不适合图像处理 &…