用队列实现栈(力扣第225题)


#include "stdio.h"
#include "stdbool.h"
#include "string.h"
#include "stdlib.h"
#include "assert.h"


//初始化队列
typedef int QueueDataType;

typedef struct queue {
	QueueDataType val;
	struct queue* next;
}Qnode;

typedef struct Queue {
	Qnode* phead;//队头
	Qnode* ptail;//队尾
	int size;//队列中的有效数据
}Queue;

//初始化队
void QueueInit(Queue* pq);

//入队
void QueuePush(Queue* pq,QueueDataType x);

//出队
void QueuePop(Queue* pq);

//获取队首元素
QueueDataType QueueFront(Queue* pq);

//获取队尾元素
QueueDataType QueueBack(Queue* pq);

//获取队列有效个数
int QueueSize(Queue* pq);

//判断队列是否为空,为空返回1,非空返回0
bool QueueEmpty(Queue* pq);

//打印队列
void QueuePrint(Queue* pq);

//销毁队列
void QueueDestory(Queue* pq);

#define _CRT_SECURE_NO_WARNINGS 1



//初始化队
void QueueInit(Queue* pq)
{
	assert(pq);
    pq->size=0;
    pq->phead=pq->ptail=NULL;
}

//入队
void QueuePush(Queue* pq, QueueDataType x)
{
	assert(pq);
    
	assert(pq);
	Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	pq->size++;
	newnode->val = x;
	newnode->next = NULL;
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
}

//出队
void QueuePop(Queue* pq) {
	assert(pq);
	Qnode* next = pq->phead->next;
	free(pq->phead);
	pq->size--;
	pq->phead = next;
}

//获取队首元素
QueueDataType QueueFront(Queue* pq) {
	assert(pq);
	assert(pq->size > 0);
	assert(pq->phead);
	return pq->phead->val;
}

//获取队尾元素
QueueDataType QueueBack(Queue* pq) {
	assert(pq);
	assert(pq->ptail);
	assert(pq->size > 0);
	return pq->ptail->val;
}

//获取队列有效个数
int QueueSize(Queue* pq) {
	assert(pq);
	return pq->size;
}

//判断队列是否为空,为空返回1,非空返回0
bool QueueEmpty(Queue* pq) {
	assert(pq);
	return pq->size == 0 ? 1 : 0;
}

//打印队列
void QueuePrint(Queue* pq) {
	assert(pq);
	assert(pq->phead);
	while (!QueueEmpty(pq))
	{
		printf("%d\n", pq->phead->val);
		QueuePop(pq);
	}
}

//销毁队列
void QueueDestory(Queue* pq) {
	assert(pq);
	Qnode* cur = pq->phead;
	while (cur) {
		Qnode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
}

typedef struct {
    Queue pq1;
    Queue pq2;
    
} MyStack;


MyStack* myStackCreate() {
    MyStack* ST=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&ST->pq1);
    QueueInit(&ST->pq2);
    return ST;
}

void myStackPush(MyStack* obj, int x) {
    if(QueueEmpty(&obj->pq1))
    {
        QueuePush(&obj->pq2,x);
    }else{
         QueuePush(&obj->pq1,x);
    }
}

int myStackPop(MyStack* obj) {
    if(QueueEmpty(&obj->pq1)){
        while((&obj->pq2)->phead!=(&obj->pq2)->ptail)
        {
            QueuePush(&obj->pq1,QueueFront(&obj->pq2));
            QueuePop(&obj->pq2);
        }
        int vala=QueueFront(&obj->pq2);
         QueuePop(&obj->pq2);
        return vala;
    }
        if(QueueEmpty(&obj->pq2)){
        while((&obj->pq1)->phead!=(&obj->pq1)->ptail)
        {
            QueuePush(&obj->pq2,QueueFront(&obj->pq1));
            QueuePop(&obj->pq1);
        }
    }
    int valb=QueueFront(&obj->pq1);
    QueuePop(&obj->pq1);
     return valb;
}

int myStackTop(MyStack* obj) {
    if(QueueEmpty(&obj->pq1)){
        return (&obj->pq2)->ptail->val;
    }
     return (&obj->pq1)->ptail->val;
}

bool myStackEmpty(MyStack* obj) {
    if(QueueEmpty(&obj->pq1)&&QueueEmpty(&obj->pq2)){
        return true;
    }
    return false;
}

void myStackFree(MyStack* obj) {
    Qnode* cur1 = (&obj->pq1)->phead;
    while(cur1){
        Qnode* next=cur1->next;
        free(cur1);
        cur1=next;
    }
    (&obj->pq1)->phead=(&obj->pq1)->ptail=NULL;
    Qnode* cur2 = (&obj->pq2)->phead;
    while(cur2){
        Qnode* next=cur2->next;
        free(cur2);
        cur2=next;
    }
   (&obj->pq2)->phead=(&obj->pq2)->ptail=NULL;
      (&obj->pq2)->phead=(&obj->pq2)->ptail=NULL;
      free(obj);
      obj=NULL;
}

/**
 * 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);
*/

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

符文协议的演变历程:从挑战到创新

在比特币网络长期面临的挑战中,与主流去中心化金融功能的兼容性一直是一大难题。相比之下,以太坊通过ERC-721和ERC-1155代币标准,为NFT和去中心化金融应用提供了支持,而比特币的应用范围却相对有限。然而,近年来&#…

Linux知识点(4)

文章目录 13. 线程13.1 什么是线程13.2 Linux下的线程13.2.1 pthread_create13.2.2 线程为什么高效?13.2.3 线程的优缺点13.2.4 线程异常13.2.5 线程用途 13.4 虚拟地址空间13.5 Linux线程控制13.5.1 POSIX线程库13.5.2 创建线程13.5.3 线程ID及进程地址空间布局13.…

如何构建企业技术架构-解决内部系统连接的问题

随着企业信息化建设的深入,各类管理系统在运营管理中发挥着关键作用。为了实现数据共享、业务流程自动化和决策支持的无缝对接,往往搭建一个高效协同的技术架构至关重要。本文将以人事系统、泛微OA(Office Automation)及ERP&#…

基于Springboot+Vue的Java项目-网上点餐系统开发实战(附演示视频+源码+LW)

大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &am…

【御控物联】Java JSON结构转换(4):对象To对象——规则属性重组

文章目录 一、JSON结构转换是什么?二、术语解释三、案例之《JSON对象 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理,代理python的服务,但是通过代理访问服务的时候,报了404的错误。 难受的是客户现场没有查看日志的权限,只有查看配置文件的权限,我们检测了几遍配置文件也没有找到问题,哎~ 问题引…

Python兼职:只需要一台电脑宅在家,轻松实现月入过万!

Python兼职副业 Python是一种简单易学、高效强大的编程语言,正变成越来越多人选择的热门技能。不论你是否有编程基础,在学习Python的道路上,坚持每天投入2小时,你将看到巨大的回报。 学习Python不仅可以为你提供更多就业机会&am…

【情侣博客网站】

效果图 PC端 建塔教程 第一步:下载网站源码(在文章下方有下载链接) 第二步:上传到服务器或虚拟主机,解压。 第三步:这一步很关键,数据库进行连接,看图 admin/connect.php就是这…

链表带环问题——leetcode环形链表1 2

证明链表带环 链表的带环问题指的是本该指向NULL的最后一个节点指向了之前的节点,导致链表成环,找不到尾结点的情况,那么我们该如何证明链表带环呢? 我们可以类比物理中的追及问题,让快慢指针同时走,两者相…

element-ui form表单自定义label的样式、内容

element-ui form表单自定义label的样式、内容 效果截图 代码 <el-form size"small" :inline"true" label-width"120px"><el-form-item prop"name"><div slot"label"><i style"color: red;"…

步步精科技获得发明型专利,提升Type-C连接器行业竞争力

在电子科技日新月异的时代&#xff0c;连接器作为电子设备中不可或缺的一部分&#xff0c;其安全性、稳定性和性能水平直接关系到设备的使用效果和用户体验。深圳市步步精科技有限公司&#xff08;以下简称“步步精科技”&#xff09;一直致力于连接器领域的技术创新和产品研发…

盒子模型之弹性盒模型

经常适用于手机端图标布局 display: flex;让这个盒子显示成弹性盒&#xff08;很适合移动端布局&#xff09; 影响&#xff1a;1.让里面的子元素默认横向排列 2.如果子元素是行内元素&#xff0c;则直接变成块元素 3.只有一个元素&#xff0c;margin: auto;自动居中 <!DOCT…

学习Python先从了解Python开始

Python是一种高级编程语言&#xff0c;它的语法简洁易读&#xff0c;功能强大&#xff0c;应用领域广泛。Python不仅适用于数据科学、机器学习、Web开发等领域&#xff0c;还可以用于自动化脚本编写、游戏开发等。在本文中&#xff0c;我们将探讨Python的特点、应用领域以及未来…

[leetcode] 54. 螺旋矩阵

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;…

js调用html页面需要隐藏某个按钮

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

7-26 单词长度

题目链接&#xff1a;7-26 单词长度 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h> #include <stdbool.h>void printLen(int len, bool printOnce) {if (len) {if (printOnce) {printf(" %d",…

微信小程序picker设置了系统年度,打开选择年份从1年开始显示

背景&#xff1a;开发微信小程序时&#xff0c;使用了picker组件&#xff0c;设置值为当前系统时间年份&#xff0c;可以正常回显年份。但是打开面板选择年份的时候&#xff0c;默认从一年开始显示的。如下图所示。 原因&#xff1a;因为绑定的年份字段为Number类型。 解决方案…

性能优化工具

CPU 优化的各类工具 network netperf 服务端&#xff1a; $ netserver Starting netserver with host IN(6)ADDR_ANY port 12865 and family AF_UNSPEC$ cat netperf.sh #!/bin/bash count$1 for ((i1;i<count;i)) doecho "Instance:$i-------"# 下方命令可以…

【AI学习中常见专业英文缩写词的解释】

前言&#xff1a; 为了看着不无聊&#xff0c;文中插入了一些AI生成的狗图片 AI(Artificail Intelligence)人工智能&#xff1a; 让机器模拟和展示人类智能的技术。 GAI(Generative Artificail Intelligence)生成式人工智能: 利用复杂的算法、模型和规则&#xff0c;从大规…

fastjson

一&#xff1a;fastjson作用 1.将Java对象转换为json字符串》响应给前端。 2.将json字符串转换为Java对象 》接受前端的json数据封装到对象中。 二&#xff1a;常用API fastjson API 入口类是 com.alibaba.fastjson.JSON ,常用的序列化操作都可以在JSON类上的静态方法直接完…