LeetCode:用队列实现栈(纯C语言)

2023-10-27

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

代码(CV复制黏贴)

            老套路二话不说,先上代码 :

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

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
int QueueSize(Queue* pq);
bool QueueEmpty(Queue* pq);

void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = 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\n");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;
	if (pq->ptail == NULL)
	{
		assert(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(!QueueEmpty(pq));
	if (pq->phead->next == NULL)
	{
		QNode* head = pq->phead;
		free(head);
		pq->phead = pq->ptail = NULL;
		pq->size = 0;
	}
	else
	{
		QNode* head = pq->phead;
		pq->phead = pq->phead->next;
		free(head);
		pq->size--;
	}
}
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return(pq->phead->data);
}
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->ptail->data;
}
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}
typedef struct {
    Queue q1;
    Queue q2;
} MyStack;


MyStack* myStackCreate() {
    MyStack* tmp = (MyStack*)malloc(sizeof(MyStack));
    if(tmp==NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    QueueInit(&(tmp->q1));
    QueueInit(&(tmp->q2));
    return tmp;
}

void myStackPush(MyStack* obj, int x) {
    if(!QueueEmpty(&obj->q1)){
        QueuePush(&obj->q1, x);
    }
    else{
        QueuePush(&obj->q2, x);
    }
}
int myStackPop(MyStack* obj) {
    Queue* empty = &obj->q1;
    Queue* noempty = &obj->q2;
    if(!QueueEmpty(empty))
    {
        empty = &obj->q2;
        noempty=&obj->q1;
    }
    while(QueueSize(noempty)>1)
    {
        QueuePush(empty, QueueFront(noempty));
        QueuePop(noempty);
    }
    int n = QueueFront(noempty);
    QueuePop(noempty);
     return n;
}

int myStackTop(MyStack* obj) {
    if(!QueueEmpty(&obj->q1))
    {
        return QueueBack(&obj->q1);
    }
    else
    {
        return QueueBack(&obj->q2);
    }
}

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

                                                         过啦!!!!!!!


思路以及题目分析

 解题思路:

         此题可以用两个队列去实现一个栈,每次始终保持一个队列为空, 入栈操作相当于给非空队列进行入队操作 出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其余元素入队到空队列,然后出队最后一个队尾元素。

        首先他们各自的特点各位要明白 

 栈的特点是:先入后出

队列的特点是:先入先出

大概就是这样了 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode:用队列实现栈(纯C语言) 的相关文章

随机推荐

  • Linux的top命令解析

    Top命令是什么 TOP命令是Linux下常用的性能分析工具 能够实时显示系统中各个进程的资源占用状况 TOP是一个动态显示过程 即可以通过用户按键来不断刷新当前状态 如果在前台执行该命令 它将独占前台 直到用户终止该程序为止 比较准确的说
  • java Process.waitFor阻塞

    关于java Process waitFor 进程阻塞问题 摘录自 http lelglin iteye com blog 1487351 问题 有同学遇到java调用Process exec node purppeteer插件去浏览器截图
  • js浏览器打开小窗口

    export const openWindow url title w h gt Fixes dual screen position Most browsers Firefox const dualScreenLeft window sc
  • 华为机试:停车场车辆统计(Java解法)

    停车场车辆统计 特定大小的停车场 数组cars 表示 其中1代表有车 0代表无车 车辆大小不一 统计停车场最少可以停多少辆车 返回具体的数字 长度小于1000 输入 小车占一个车位 长度1 中车占两个车位 长度2 大车占三个车位 长度3 输
  • 虚函数在对象中的内存布局

    典型地 C 通过虚函数实现多态性 多态性的定义 无论发送消息的对象属于什么类 他们均发送具有相同形式的消息 对消息的处理方式可能随接受消息的对象而变 具体地说 在某个基类上建立起来的类的层次结构中 可以对任何一个派生类的对象中的同名成员函数
  • VirtualKD-3.0双机调试过程问题记录

    1 vmware虚拟机本身不需要额外配置 但虚拟机名不要是中文 不然会卡死 2 打开virtual 然后点击debugger path 选择windbg exe 此时必须选windbg 选windbgx会没有效果 然后windug exe
  • 报错 RuntimeError: No such operator image::read_file

    初学者在刚接触cv时经常会遇到的问题 一般是文件输入的路径不对 linux 系统使用 分割地址 Windows 使用 分割 如果直接使用某个文件的地址 注意在双引号外加 r 如 r C Users master Desktop 1 jpg
  • C++学习—类的成员函数和变量的访问、静态与非静态成员函数

    类的成员访问方式可以分为两类 没有实例化对象的访问 有实例化对象的访问 一 没有实例化对象的访问 class controller public static void func protected int a int b int main
  • JSON—接收服务器端传来的数据

    1 服务器端传送json格式的数据代码如下 这里指在servlet类中的情况 import java io IOException import java io PrintWriter import javax servlet Servle
  • babel—ES6代码转换为ES5代码

    为什么要将ES6代码转换为ES5代码 为了浏览器兼容 以及为了在node js环境可以顺畅运行应用程序 ES6作为JS的新规范 加入了很多新的语法和API 但现代浏览器对ES6新特性支持度不高 所以需将ES6代码转为ES5代码 如何转换 初
  • Darknet训练yolov7-tiny(AlexeyAB版本)

    darknet框架训练yolov7 Yolov7在darknet框架下的训练配置过程 配置darknet环境 官方数据集下载 模型和配置文件 训练之前必须看 参数修改 模型训练 模型评估 模型测试 Yolov7在darknet框架下的训练配
  • BES2300X,BES2500X——音频通路(audio)原理解析(二)

    基于BES2300系列芯片的audio音频通路详解 引言 BES2300X BES2500X系列博文请点击这里 本文是BES2300X BES2500X系列博文的audio音频通路部分 目前国内市场 BES的TWS方案风生水起 写一下两年来
  • 手写数字识别的现状

    1 研究背景 手手写数字识这项技术是光学字符识别 Optical Character Recognition 简称OCR 的一个重要分支 主要分为脱机手写数字识别和联机手写数字识别 其中 联机手写数字识别相对较简 单些 它利用实时监控数字输
  • qt信号槽同步问题

    目录 信号槽 注意事项 具体例子 线程安全问题的例子 信号槽 在Qt编程中 信号 Signal 和槽 Slot 是一种用于在对象之间进行通信的机制 信号用于发出事件 而槽用于响应这些事件 一个对象可以发出信号 另一个对象可以通过连接到该信号
  • [2018.10.25]高通QFIL刷机:高通sdm845_la2.0用QFIL软件meta_build和flat_build刷机

    1 代码准备 i amss standard oem 高通源码 ii test device amss standard oem对应的二进制文件 高通已经编译 iii caf 高通源码对应的谷歌源码 2 编译源码 将amss standar
  • 如何解决Ubuntu终端显示exprot: command not foundNo command 'pyenv' found, did you mean: Command 'p7env' from

    前天安装pyenv失败后 每次打开终端都会显示这样的错误提示 开始以为命令历史的问题 去 bashrc的历史记录中删了都没用 最后发现应该是安装的问题 解决如下 首先安装git sudo apt install git 然后克隆pyenv仓
  • 奥特曼系列ol进不去服务器,奥特曼系列OL闪退怎么办?解决方案

    奥特曼系列OL闪退怎么办 解决方案 2016 02 14 作者 说玩小编 来源 说玩网 评论 9条 我要评论 奥特曼系列OL闪退怎么办 在玩奥特曼系列OL的时候 是不是有时候会遇到黑屏或者闪退等种种问题 所以小编在这里为大家提供一些解决这些
  • c++指针的使用

    指针的基本概念 指针是一个变量 其值为另一个变量的地址 即内存位置的直接地址 指针的作用 可以通过指针间接访问内存 内存编号是从0开始记录的 一般用十六进制数字表示 可以利用指针变量保存地址 指针变量定义语法 数据类型 变量名 int ma
  • 华为OD机试 - 字符串分割(二)(Java)

    题目描述 给定一个非空字符串S 其被N个 分隔成N 1的子串 给定正整数K 要求除第一个子串外 其余的子串每K个字符组成新的子串 并用 分隔 对于新组成的每一个子串 如果它含有的小写字母比大写字母多 则将这个子串的所有大写字母转换为小写字母
  • LeetCode:用队列实现栈(纯C语言)

    题目链接 225 用队列实现栈 力扣 Leetcode 代码 CV复制黏贴 老套路二话不说 先上代码 typedef int QDataType typedef struct QueueNode struct QueueNode next