[C/C++]数据结构 LeetCode:用栈实现队列

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

功能思路: 

在实现本题前,需要先构建好栈的基本功能,可以参考:http://t.csdnimg.cn/Kha16

1.出队列 和 入队列

现在我们有两个栈,假设在第一个栈中依次入栈1 2 3 4 5,另一个为空栈

现在要出队列的话,应该把1出队,所以需要把除了栈底元素的其他元素出栈并且入到第二个栈里,这时就可以将1出队,但是将数据导入另一个栈时,数据会倒过来

如果要再次出队列的话,应该把2出队,就不需要把数据导一次了,直接栈顶出栈即可.

若此时再入队6 7的话,可以直接把6 7入到第一个栈中,因为出栈可以直接再第二个栈中操作

所以我们可以把将一个栈专门用来入数据,另一个栈专门用来出数据,每次出队之前先判断出数据的栈是否为空,如果出数据那个栈不为空的话,直接出数据即可,否则就将入数据的栈中的数据导入出数据的栈中,再出栈.

2.返回队列开头元素

如果出数据的栈不为空,栈顶元素即为队列开头元素,否则就需要将入数据的栈的元素导入出数据的栈中,在返回栈顶元素

3.判空

两个栈同时为空,说明队列为空

参考代码:


typedef int STDataType;
typedef struct stack
{int* a;int top;int capacity;
}ST;void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;  //top初始化位0,top的值可以表示栈元素的个数
}void STPush(ST* ps, STDataType x)
{assert(ps);//扩容if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* ret = (STDataType*)realloc(ps->a,sizeof(STDataType)*newcapacity);if (ret == NULL){perror("realloc");return;}ps->a = ret;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}void STPop(ST* ps)
{assert(ps);assert(ps->top);ps->top--;
}STDataType STTop(ST* ps)
{assert(ps);assert(ps->top);return ps->a[ps->top - 1];
}bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}int STSize(ST* ps)
{assert(ps);return ps->top;
}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a == NULL;ps->top = ps->capacity = 0;
}typedef struct {ST Queuepush;ST Queuepop;
} MyQueue;MyQueue* myQueueCreate() {MyQueue *obj=(MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->Queuepush);STInit(&obj->Queuepop);return obj;
}void myQueuePush(MyQueue* obj, int x) {STPush(&obj->Queuepush,x);
}int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->Queuepop)){while(!STEmpty(&obj->Queuepush)){STPush(&obj->Queuepop,STTop(&obj->Queuepush));STPop(&obj->Queuepush);}}return STTop(&obj->Queuepop);
}int myQueuePop(MyQueue* obj) {int front = myQueuePeek(obj);STPop(&obj->Queuepop);return front;
}bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->Queuepop)&&STEmpty(&obj->Queuepush);
}void myQueueFree(MyQueue* obj) {STDestroy(&obj->Queuepop);STDestroy(&obj->Queuepush);free(obj);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】zset常用命令集合间操作内部编码使用场景

文章目录 前置知识列表、集合、有序集合三者的异同点 普通命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合之间的操作ZINTERSTOREZUNIONSTORE 命令小结内部编码测试内部编…

【LeetCode刷题-树】--998.最大二叉树II

998.最大二叉树II /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

【数据结构】C语言实现队列

目录 前言 1. 队列 1.1 队列的概念 1.2 队列的结构 2. 队列的实现 2.1 队列的定义 2.2 队列的初始化 2.3 入队 2.4 出队 2.5 获取队头元素 2.6 获取队尾元素 2.7 判断空队列 2.8 队列的销毁 3. 队列完整源码 Queue.h Queue.c 🎈个人主页&#xff1a…

电子学会2023年6月青少年软件编程(图形化)等级考试试卷(四级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(四级) 一、单选题(共10题,共30分) 1. 下列积木运行后的结果是?( )(说明:逗号后面无空格) A.

【Java集合】聊聊Hashmap的哈希函数、扩容、树化

哈希函数 hashmap是开发中常用的一个集合,除了一些基本的属性、put、get等流程,本篇文章主要介绍下哈希函数、扩容、树化的一些细节。 而hash函数就是hashmap的重中之重。 static final int hash(Object key) {int h;return (key null) ? 0 : (h key…

阅读芯片源码(RTL)

part one 主要的原则。 一个rtl可以是这样的: 经常大家习惯于算法和数据结构。对于设计的部分,落实不一定多。 另外一个rtl也可以是这样的: 所以从不同的层面来讲,一个Rtl有不同的表述。 首先大概把所有的部分浏览一遍&#x…

CICD 持续集成与持续交付——gitlab

部署 虚拟机最小需求:4G内存 4核cpu 下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装依赖性 [rootcicd1 ~]# yum install -y curl policycoreutils-python openssh-server perl[rootcicd1 ~]# yum install -y gitlab-ce-15.9.3-ce.0…

Jmeter——结合Allure展示测试报告

在平时用jmeter做测试时,生成报告的模板,不是特别好。大家应该也知道allure报告,页面美观。 先来看效果图,报告首页,如下所示: 报告详情信息,如下所示: 运行run.py文件,…

AVL树实现

目录 ​编辑 一,AVL树的概念 二,实现AVL树(部分) 1.AVL树的节点 2.AVL数的插入 1.当根节点为nullptr时要执行如下代码: 2.当根节点不为nullptr时 1.当parent的_bf变为0时,parent之前的_bf的大小就是…

前端面试:如何实现并发请求数量控制?

题目:实现一个并发请求函数concurrencyRequest(urls, maxNum) 要求如下: 要求最大并发数 maxNum;每当有一个请求返回,就留下一个空位,可以增加新的请求;所有请求完成后,结果按照 urls 里面的顺序依次打出;…

C++初阶-内存管理

内存管理 一、C/C内存分布二、C语言中动态内存管理方式:malloc/calloc/realloc/free三、C内存管理方式new/delete操作内置类型new和delete操作自定义类型 四、operator new与operator delete函数operator new与operator delete函数 五、new和delete的实现原理内置类…

论文-分布式-拜占庭将军问题

目录 0-前言 1-导引 2-不可能性 3将军(1叛徒)问题不存在解/不能达成共识 少于3m1个将军(有m个叛徒)不存在解/不能达成共识 精确一致性与近似一致性是同等困难的 3-使用口头消息的解 “口头消息”的含义 OM(m)算法的步骤 OM(m)算法的正确性推导 4-使用签名消息情况下…