leetcode:225. 用队列实现栈

news2025/1/30 15:55:05

一、题目

链接:225. 用队列实现栈 - 力扣(LeetCode)

函数原型:

typedef struct { 

} MyStack;

MyStack* myStackCreate() 

void myStackPush(MyStack* obj, int x) 

int myStackPop(MyStack* obj) 

int myStackTop(MyStack* obj) 

bool myStackEmpty(MyStack* obj) 

void myStackFree(MyStack* obj) 

二、思路

利用队列实现栈:

1.我的栈的结构

“我的栈”是一个结构体,存放两个队列即可

2.我的栈创建及其初始化

函数返回值是“我的栈”结构体指针,动态申请一个“我的栈”大小内存空间,然后初始化“我的栈”结构体中中的两个队列,最后返回“我的栈”的结构体指针

3.我的栈入栈

“我的栈”中有两个队列,选择一个空队列进行存储数据。由于栈的入栈和队列的入队都是从尾部进行存储数据的,所以直接对空队列进行入队操作即可。

如何找到空队列?

利用假设法,假设q1为空队列,q2为非空队列;判断q1是否为空,如果不为空,则将空队列设为q2,非空队列设为q1.

4.我的栈出栈

由于栈删除元素是从栈顶删除,而队列删除元素是从队头删除,所以需要先将非空队列中的前n-1个元素出队并入队到空队列中,第n个元素直接出队无需入队。即可完成“我的栈”的出栈。

5.我的栈取栈顶元素

取栈顶元素是在栈尾部进行的,所以可以对非空队列的取队尾元素。

6.我的栈判空

只要对两个队列判空即可,只有当两个队列都为空时,“我的栈”才判断为空。

7.我的栈销毁

首先对“我的栈”中两个队列进行队列销毁,然后再对动态申请的“我的栈”空间进行动态内存释放。

三、代码

typedef int QDataType;

//队列的结构定义
typedef struct QueueNode{
    QDataType val;
    struct QueueNode *next;
}QNode;

//用结构体管理队列
typedef struct Queue{
    QNode* phead;
    QNode* ptail;
    int size;
}Queue;

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

//入队
void QueuePush(Queue *pq,QDataType x)
{
    assert(pq);
    QNode *newnode=(QNode*)malloc(sizeof(QNode));
    if(newnode==NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    newnode->val=x;
    newnode->next=NULL;
    if(pq->phead==NULL)//队列为空
        pq->phead=pq->ptail=newnode;
    else
    {
        pq->ptail->next=newnode;
        pq->ptail=newnode;
    }
    pq->size++;
}

//出队
void QueuePop(Queue* pq)
{
    assert(pq);
    assert(pq->phead);//空队列

    if(pq->phead==pq->ptail)
    {
        pq->ptail=NULL;
    }
    QNode* tmp=pq->phead;
    pq->phead=tmp->next;
    free(tmp);
    tmp=NULL;
    pq->size--;
}

//取队头元素
QDataType QueueFront(Queue* pq)
{
    assert(pq);
    assert(pq->phead);
    return pq->phead->val;
}

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

//判空
bool QueueEmpty(Queue *pq)
{
    assert(pq);
    return pq->phead==NULL;
}

//销毁队列
void QueueDestroy(Queue* pq)
{
    assert(pq);
    QNode *cur=pq->phead;
    while(cur)
    {
        QNode* tmp=cur;
        cur=cur->next;
        free(tmp);
        tmp=NULL;
    }
    pq->phead=pq->ptail=NULL;
    pq->size=0;
}

typedef struct {
    Queue q1;
    Queue q2;
} MyStack;

//我的栈创建及其初始化
MyStack* myStackCreate() {
    MyStack *ps=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&ps->q1);
    QueueInit(&ps->q2);

    return ps;
}

void myStackPush(MyStack* obj, int x) {
    //利用假设法
    Queue *empty=&obj->q1;
    Queue *noneempty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        empty=&obj->q2;
        noneempty=&obj->q1;
    }

    QueuePush(noneempty,x);
    //QueuePush(&obj->q1,x);
}

//我的栈-出栈
int myStackPop(MyStack* obj) {

    // while(obj->q1.size>1)
    // {
    //     QueuePush(&obj->q2,QueueFront(&obj->q1));
    //     QueuePop(&obj->q1);
    //     //QueuePush(&obj->q2,QueuePop(&obj->q1));
    // }
    // int stackpop=QueueFront(&obj->q1);
    // QueuePop(&obj->q1);

    // while(obj->q2.size)
    // {
    //     QueuePush(&obj->q1,QueueFront(&obj->q2));
    //     QueuePop(&obj->q2);
    //     //QueuePush(&obj->q1,QueuePop(&obj->q2));
    // }

    // return stackpop;

    //利用假设法
    Queue *empty=&obj->q1;
    Queue *noneempty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        empty=&obj->q2;
        noneempty=&obj->q1;
    }

    while(noneempty->size>1)
    {
        QueuePush(empty,QueueFront(noneempty));
        QueuePop(noneempty);
    }
    int stackpop=QueueFront(noneempty);
    QueuePop(noneempty);
    return stackpop;
}

//我的栈-出栈
int myStackTop(MyStack* obj) {
    Queue* empty=&obj->q1;
    Queue* noneempty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    {
        empty=&obj->q2;
        noneempty=&obj->q1;
    }
    return QueueBack(noneempty);
}

//我的栈-判空
bool myStackEmpty(MyStack* obj) {
    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);
*/

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

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

相关文章

CMake构建工具

文章目录 CMake构建工具1.概念2.mk文件3.CmakeList4.预编译 CMake构建工具 1.概念 Android构建原始库的工具,对mk构建工具封装,还是makefile。 加载lib库 2.mk文件 //call调用test-dir这个方法,返回mk文件的路径,LOCAL_PATH这…

计算机组成原理笔记——存储器(静态RAM和动态RAM的区别,动态RAM的刷新, ROM……)

■ 随机存取存储器 ■ 1.随机存取存储器:按存储信息的原理不同分为:静态RAM和动态RAM 2.静态RAM(SRAM):用触发器工作原理存储信息,但电源掉电时,存储信息会丢失具有易失性。 3.存储器的基本单元…

C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)

目录 一、System.Net命名空间 1.Dns类 (1)示例源码 (2)生成效果 2.IPAddress类 (1)示例源码 (2)生成效果 3.IPEndPoint类 (1) 示例源码 &#xff0…

五、ZooKeeper的shell操作

目录 1、客户端连接 2、shell基本操作 2.1 操作命令

分享一个判断曲线的趋势的Demo

需求背景 最近在处理数据,横坐标是时间,纵坐标是价格,需要判断一段时间内,由这些点绘制成的曲线的走势,比如趋势朝上,趋势朝下,水平调整这三种趋势。尝试了不少方法,下面这个效果还…

数据结构算法-冒泡排序算法

引言 虽然选择排序好用 ,但有点问题 也就是频繁找最大值下标 放到 未排序的后面 因为每次需要扫描整个未排序序列,找到最大值或最小值的下标,并将其交换到未排序序列的最后一个位置。这样做的问题在于,在后面的迭代中&#xff0c…

Vue安装及环境配置详细教程

一、下载node.js 访问node.js官网:Download | Node.js 选择Windows Installer (.msi)的64-bit进行下载。 在E盘新建一个文件夹,取名为nodejs,也可以在其他盘符新建。 在安装node.js时,点击Change...,进行切换盘符安…

【UE】UEC++获取屏幕颜色GetPixelFromCursorPosition()

目录 【UE】UE C 获取屏幕颜色GetPixelFromCursorPosition() 一、函数声明与定义 二、函数的调用 三、运行结果 【UE】UE C 获取屏幕颜色GetPixelFromCursorPosition() 一、函数声明与定义 创建一个蓝图方法库方法 GetPixelFromCursorPosition(),并给他指定UF…

循环队列的结构设计和基本操作的实现(初始化,入队,出队,判空,获取长度,清空,销毁)

目录 1.队列的定义 2.循环队列的设计图示 3.循环队列的结构设计 4.循环队列的实现 5.循环队列的总结 1.队列的定义 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一…

[二分查找]LeetCode2009 :使数组连续的最少操作数

本文涉及的基础知识点 二分查找算法合集 作者推荐 动态规划LeetCode2552:优化了6版的1324模式 题目 给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 任意 整数。 如果 nums 满足以下条件,那么它是 连续的 …

【动态规划】LeetCode-91.解码方法

🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…

【计算机网络笔记】802.11无线局域网

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

<DB2>《AIX服务器DB2数据库裸设备表空间扩容方案》

《AIX服务器DB2数据库裸设备表空间扩容方案》 1 表空间状态查看1.1 连接数据库(实例用户操作)1.2 查看表空间剩余(实例用户操作)1.3 查看所属表空间的容器属性(实例用户操作) 2 VG状态和LV状态查看2.1 查看…

Python 爬虫 之scrapy 框架

文章目录 常用的命令开始爬虫请求与响应让控制台只输出想要的信息创建一个py 文件来帮忙运行爬虫 工作原理图实战 常用的命令 Scrapy是一个用于爬取网站数据的Python框架,以下是一些常用的Scrapy命令: 开始的时候 用 cd 进入你想创建scrapy 的文件夹 &a…

EasyExcel写入多个sheet

直接上代码&#xff1a; public static void main(String[] args) {// 设置excel工作簿ExcelWriter excelWriter EasyExcel.write("F:\\excel\\a.xls").build();List<User> userList new ArrayList<>();userList.add(new User("lisi", "…

QT 中使用 QTableView 和 QStandardItemModel 实现将数据导出到Excel 和 从Excel导入到 QTableView 的功能

简介 在Qt中&#xff0c;使用QTableView和QStandardItemModel来实现将数据导出到Excel和从Excel导入到QTableView的功能&#xff0c;而不使用第三方库&#xff08;如QXlsx&#xff09;。 效果 将 QTableView 中的数据导出到Excel //从tableview 导出到 EXcle void MainInterfa…

数据结构第7次练习-图(基础篇)

一&#xff1a;判断题 1-1 答案&#xff1a;T 解析&#xff1a;c到a的最短路径是12214&#xff0c;所以是大于10的 1-2 答案&#xff1a;T 一个连通分量要进行一次广度优先搜索 1-3 答案&#xff1a;F 解析&#xff1a;是存在等于顶点的个数减一的情况&#xff0c;比如三个顶点…

六、ZooKeeper Java API操作

目录 1、引入maven坐标 2、节点的操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。 Curator包含了几个包:

【大数据】HBase 中的列和列族

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…