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

news2025/1/16 16:12:48


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

 

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

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

相关文章

信号处理相关知识

一: 1.序列——三种典型序列通过matlab绘图即可 2.数字信号的自变量一定是整数,幅度上取值是有限的状态(不一定是整数)。 3.抽取和插值 4.模拟正弦信号sin(wt):w是角频率,单位rad/s,f是频率w/2Π。 5.假设用采样周…

盒子模型之弹性盒模型

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

CDPR全力开发《巫师4》,吸取《2077》教训

爆料来啦&#xff01;CDPR全力开发《巫师4》&#xff0c;吸取《2077》教训&#xff01; CD Projekt Red&#xff08;CDPR&#xff09;今天透露&#xff0c;目前全公司都在专心致志地开发《巫师4》&#xff0c;而《赛博朋克2077》的续作暂时还在早期阶段。之前参与2077的大多数…

228 基于matlab的神经网络人脸识别

基于matlab的神经网络人脸识别。 人脸识别以视网膜、 虹膜、 指纹等生物特征的识别作为生物标识符。生物特征识别不很容易伪造、 放错位置。新型脸识别使用的方法 RobustPCA 和径向基函数网络。程序已调通&#xff0c;可直接运行。 228 人脸识别 生物特征识 神经网络 - 小红书 …

12. MyBatis(二)

源码位置&#xff1a;MyBatis_demo 上篇文章我们学习了MyBatis的定义以及增删查改操作&#xff0c;并且学习了如何在xml文件中编写SQL时使用#{}的方式将参数和对象的属性映射到SQL语句中&#xff0c;上篇的内容已经足以应对大部分场景&#xff0c;本篇文章我们就要学习一下MyBa…

Jmeter 测试Dubbo接口-实例

1、Dubbo插件准备 ①把jmeter-plugins-dubbo-2.7.4.1-jar-with-dependencies.jar包放在D:\apache-jmeter-5.5\lib\ext目录 ②重新打开Jmeter客户端 在线程组-添加-取样器-dubbo simple&#xff0c;添加dubbo接口请求 2、Jmeter测试lottery接口 ①配置zookeeper参数 由于dub…

MapReduce案例-电影网站数据统计分析

本文适合大数据初学者学习MapReduce统计分析业务问题的步骤和基础的MapReduce编程方法&#xff0c;初步掌握Hadoop对计算任务的管理。 本文末尾有全部数据集和完整代码连接。 1.准备工作 安装Hadoop:Hadoop 3.3.2 离线安装-CSDN博客 按照好Hadoop之后要检查一下datanode运行情况…

Python数据容器(三)

一.tuple&#xff08;元组&#xff09; 1.元组同列表一样&#xff0c;都可以封装多个、不同类型的元素在内。 但最大的不同点在于&#xff1a;元组一旦定义完成&#xff0c;就不可修改。 2.元组定义&#xff1a;定义元组使用小括号&#xff0c;且使用逗号隔开各个数据&#…

大气的免费wordpress模板

国产的wordpress模板&#xff0c;更适合中国人使用习惯&#xff0c;更符合中国老板的审美的大气wordpress企业官网建站模板。 WordPress模板&#xff0c;也称为主题&#xff0c;是用于定义WordPress网站或博客外观和功能的预设计文件集。这些模板使用HTML、CSS和PHP代码构建&a…

ARM之栈与方法

ARM之栈与方法 计算机中的栈是一种线性表&#xff0c;它被限定只能在一端进行插入和删除操作&#xff08;先进后出&#xff09;。通常将可以插入和删除操作的一端称为栈顶&#xff0c;相对的一端为栈底。 通常栈有递增堆栈&#xff08;向高地址方向生长&#xff09;、递减堆栈…

视频监控平台的超大任务文件导入功能,如何通过日志判断导入是否成功

目录 一、概述 &#xff08;一&#xff09;编写目的 &#xff08;二&#xff09;适用情况 &#xff08;三&#xff09;导入相关参数说明 二、文件导入说明 &#xff08;一&#xff09; 日志文件路径 &#xff08;二&#xff09;不同情况下的说明和提示 1、 所有数据正确…

便携式手提Camera Link 模拟源测试设备

便携式手提Camera Link 模拟源测试设备 平台简介 便携式手提CameraLink模拟源测试设备&#xff0c;以PCIe的Camera link 播出卡和X86主板为基础&#xff0c;构建便携式的手提设备。 平台默认操作系统为win7 64位系统&#xff1b;具备丰富的外设接口&#xff0c;如VGA、HDMI、千…

患者关系管理系统功能详解

脉购健康管理系统&#xff08;软件&#xff09;包含&#xff1a;客户开卡、健康档案、问卷调查、问诊表、自动设置标签、自动随访、健康干预、健康调养、历年指标趋势分析、疾病风险评估、饮食/运动/心理健康建议、同步检查报告数据、随访记录、随访电话录音、健康阶段总结、打…

ELK日志采集系统

1.什么是ELK ELK 是一套流行的数据搜索、分析和可视化解决方案&#xff0c;由三个开源项目组成&#xff0c;每个项目的首字母合起来形成了“ELK”这一术语&#xff1a; Elasticsearch (ES): Elasticsearch 是一个基于 Apache Lucene 构建的分布式、实时搜索与分析引擎。它能够…

AI绘画 究竟在哪些方面降低了门槛

AI绘画的产物是图像。图像对人类的认知、情感和文化发展起着重要的作用&#xff0c;包括信息传递、创造性表达、历史记录、审美享受和交流。 从原来的纸笔调色板到数字时代的数字板、绘图软件&#xff0c;再到AI绘画时代&#xff0c;任何人都可以用几行简单的文字创作出高质量…

Python实现贪吃蛇

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待!通过购买专栏或者CSDN问答提问,采纳后,私信博主。提供源码! 说明:需要的话联系博主!谢谢。 代码: import pygame import random import tkinter as tk from tkinter import mess…

免费建筑su模型网站:让设计师的创意飞翔!

对于设计师而言&#xff0c;建筑SU模型是表达创意、规划空间、实现设计概念的重要工具。为了满足设计师对优质模型的需求&#xff0c;有许多网站提供免费的建筑SU模型下载服务&#xff0c;这些网站无疑为设计师们提供了广阔的创意空间和无尽的灵感。 1.建e网&#xff1a;拥有百…

图神经网络与分子表征:7. LEFTNet

在执行性质预测任务时&#xff0c;我们需要考虑两个问题&#xff1a;1. 如何正确的将图结构进行编码&#xff1f;2. 如何汇聚编码信息预测整个分子的任务&#xff1f; LEFTNet 就是通过回答上述问题来进行模型设计的。 原文地址 算法设计 原文中&#xff0c;作者定义了三个图…

SpringBoot + Redis实现用户信息登录的缓存

&#x1f34e;前言 &#x1f350;项目的背景 背景&#xff1a;&#x1f349;当我们在完成用户信息登录时&#xff0c;我们往往每次都会在数据库中查询用户的记录&#xff0c;生成token并返回给前端&#xff0c;不过这样会有一定的问题。 &#x1f350;造成的问题 问题&#xf…

【Linux】文件描述符——万字详解

目录​​​​​​​ 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切…