每日一练——用队列实现栈

news2025/1/12 15:44:53

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

Queue.h

#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int QDataType;

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

typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
} Queue;

Queue* QueueCreate();
void QueueDestroy(Queue* q);

void QueuePush(Queue* q, QDataType x);
QDataType QueuePop(Queue* q);

QDataType QueueFront(Queue* q);
QDataType QueueBack(Queue* q);

int QueueSize(Queue* q);
bool QueueEmpty(Queue* q);

Queue.c

#include"Queue.h"

Queue* QueueCreate()
{
	Queue* q = (Queue*)malloc(sizeof(Queue));
	if (NULL == q)
	{
		perror("malloc failed");
		exit(-1);
	}
	q->head = q->tail = NULL;
	q->size = 0;
	return q;
}

void QueueDestroy(Queue* q)
{
	assert(q);
	while (!QueueEmpty(q))
		QueuePop(q);
	free(q);
}

void QueuePush(Queue* q, QDataType x)
{
	assert(q);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (NULL == newnode)
	{
		perror("malloc failed");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	if (QueueEmpty(q))
		q->head = q->tail = newnode;
	else
	{
		q->tail->next = newnode;
		q->tail = newnode;
	}
	++(q->size);
}

QDataType QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	QDataType ret = q->head->data;
	QNode* newhead = q->head->next;
	free(q->head);
	q->head = newhead;
	if (NULL == newhead)
		q->tail = NULL;
	--(q->size);
	return ret;
}

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	return q->head->data;
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));
	return q->tail->data;
}

int QueueSize(Queue* q)
{
	assert(q);
	return q->size;
}

bool QueueEmpty(Queue* q)
{
	assert(q);
	return !(q->size);
}

MyStack.h

#pragma once
#include"Queue.h"

typedef struct MyStack
{
	Queue* qa;
	Queue* qb;
} MyStack;


MyStack* myStackCreate();

void myStackPush(MyStack* st, int x);

QDataType myStackPop(MyStack* st);

QDataType myStackTop(MyStack* st);

bool myStackEmpty(MyStack* st);

void myStackFree(MyStack* st);

MyStack.c

#include "MyStack.h"

MyStack* myStackCreate()
{
	MyStack* st = (MyStack*)malloc(sizeof(MyStack));
	if (NULL == st)
	{
		perror("malloc failed");
		exit(-1);
	}
	st->qa = QueueCreate();
	st->qb = QueueCreate();
	return st;
}

void myStackPush(MyStack* st, QDataType x)
{
	assert(st);
	if (QueueEmpty(st->qb))
		QueuePush(st->qa, x);
	else
		QueuePush(st->qa, x);
}

QDataType myStackPop(MyStack* st)
{
	assert(st);
	assert(!myStackEmpty(st));
	Queue* empty = st->qa;
	Queue* noempty = st->qb;
	if (!QueueEmpty(st->qa))
	{
		empty = st->qb;
		noempty = st->qa;
	}
	QDataType ret = noempty->tail->data;
	while (QueueSize(noempty) > 1)
	{
		QDataType ret = QueuePop(noempty);
		QueuePush(empty, ret);
	}
	QueuePop(noempty);
	return ret;
}

QDataType myStackTop(MyStack* st)
{
	assert(st);
	assert(!myStackEmpty(st));
	if (QueueEmpty(st->qb))
		return st->qa->tail->data;
	else
		return st->qb->tail->data;
}

bool myStackEmpty(MyStack* st)
{
	return (QueueEmpty(st->qa) && QueueEmpty(st->qb));
}

void myStackFree(MyStack* st)
{
	QueueDestroy(st->qa);
	QueueDestroy(st->qb);
	free(st);
}

test.c

#include<stdio.h>
#include "MyStack.h"

static void Qprint(Queue* q)
{
	assert(q);
	QNode* cur = q->head;
	printf("head<-");
	while (cur)
	{
		printf("%d<-", cur->data);
		cur = cur->next;
	}
	printf("tail\n");
}

void test1()
{
	MyStack* st = myStackCreate();
	myStackPush(st, 1);
	myStackPush(st, 2);
	printf("top = %d\n", myStackTop(st));
	myStackPush(st, 3);
	printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);
	printf("top = %d\n", myStackTop(st));
	myStackPush(st, 4);
	printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);
	printf("top = %d\n", myStackTop(st));
	myStackPop(st);
	printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);
	myStackPop(st);
	printf("qa:"); Qprint(st->qa); printf("qb:"); Qprint(st->qb);

	printf("top = %d\n", myStackTop(st));


	myStackFree(st);
}

int main()
{
	test1();
	return 0;
}

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

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

相关文章

【RabbitMQ】异步消息及Rabbitmq安装

https://blog.csdn.net/weixin_73077810/article/details/133836287 https://www.bilibili.com/video/BV1mN4y1Z7t9/ 同步调用和异步调用 如果我们的业务需要实时得到服务提供方的响应&#xff0c;则应该选择同步通讯&#xff08;同步调用&#xff09;。 如果我们追求更高的效…

【MySQL】在CentOS环境下安装MySQL

目录 一、卸载残留环境 二、获取官方yum源 三、安装yum源 四、安装MySQL 五、启动MySQL 一、卸载残留环境 输入 ps axj | grep mysql 查看是否存在正在运行的MySQL服务 如果有&#xff0c;则先输入 systemctl stop mysqld 来关闭服务 然后输入 rpm -qa | grep mysql 查看…

搭建k8s集群报错unknown command “\u00a0“ for “kubeadm init“

搭建k8s报错unknown command “\u00a0” for “kubeadm init” 网上搜了一下&#xff0c;是因为复制过来的命令前面包含了空格&#xff0c;将复制的命令放到idea可以清楚看到几个命令前面有空格&#xff0c;删除掉就好了&#xff0c;记录一下

达梦基于什么数据库?

达梦数据库&#xff08;DM Database&#xff09;是中国自主研发的高性能关系型数据库管理系统。它并不是基于其他现有的数据库系统&#xff0c;而是完全自主开发的。这种独立开发使其具有很多独特的特点和优势&#xff0c;特别是在安全性、性能优化、适应中国本地化需求等方面。…

【Linux】软硬连接

目录 一.现象 二.硬链接 用处 三.软链接 用处 ​编辑 hello&#xff0c;大家好&#xff0c;今天&#xff0c;我们要学习的内容是软硬链接的。我们将从软连接的作用&#xff0c;硬链接的作用 和软硬链接的区别等方面学习。那我们就开始啦&#xff01; 在看本篇博客之前&a…

leetcode第709题:转换成小写字母

注意字符不仅有26个英文字母&#xff0c;还有特殊字符。特殊字符的话&#xff0c;原样输出。 public class Solution {public char toLowChar(char c){if(c>a&&c<z){return c;}else if(c>A&&c<Z){int n(int)c32;return (char)n;}return c;}publi…

华为机考入门python3--(36)牛客36-字符串加密

分类&#xff1a;字符串 知识点&#xff1a; 判断一个元素是否在集合中 if char not in key_set 计算字母差 index ord(char) - ord(a) 题目来自【牛客】 # 生成加密表 def generate_cipher_table(key):key_set set()cipher_table ""# 去重for char in k…

红队攻防渗透技术实战流程:中间件安全:JettyJenkinsWeblogicWPS

红队攻防渗透实战 1. 中间件安全1.1 中间件-Jetty-CVE&信息泄漏1.2 中间件-Jenkins-CVE&RCE执行1.2.1 cve_2017_1000353 JDK-1.8.0_291 其他版本失效1.2.2 CVE-2018-10008611.2.3 cve_2019_100300 需要用户帐号密码1.3 中间件-Weblogic-CVE&反序列化&RCE1.4 应…

微软正在推动 OpenAI 转变为营利性公司!Sam Altman 或拥有更多股权 股东也“逼宫”保时捷

目前&#xff0c;OpenAI估值为860亿美元&#xff0c;转型为营利性公司或加速OpenAI IPO&#xff0c;微软及其他投资者认为&#xff0c;若 Altman拥有更多股权&#xff0c;可能就不会那么有动力专注于其他项目和投资其他AI公司。 根据The Information最新报道&#xff0c;Sam A…

使用mysqldump导出mysql数据库的数据

使用mysqldump导出mysql数据库的数据 mysqldump是mysql自带的一个工具&#xff0c;路径一般是C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe 有点需要导出的数据库&#xff0c;选择导入/导出&#xff0c;选择用mysqldump导出 在使用 IntelliJ IDEA 通过 mysqldum…

59.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(7)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;58.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;6&#xff09; 关于御剑…

Integer溢出问题

0. 背景 在刷 LeetCode 时&#xff0c;代码的执行结果与预期出现了偏差&#xff0c;原因是 Int 值超过了允许范围 [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1 ] [−231,231−1]。工作中从来没有遇到过这种情况&#xff0c;之前的认知是如果 Int 中存储的值超过了允许范围也许…

Java_FileIO流

存储数据的方案 有些数据想长久保存起来&#xff0c;咋整&#xff1f; 文件时非常重要的存储方式&#xff0c;在计算机硬盘中。 即便断电&#xff0c;或者程序终止了&#xff0c;存储在硬盘文件中的数据也不会丢失。 File File 是Java.io.包下的类&#xff0c;File类对象&…

Python高级编程:Functools模块的8个高级用法,强烈建议添加到你的开发工具箱中!

目录 1. functools.partial 2. functools.lru_cache lru_cache的特点 cache的特点 性能比较与选择 3. functools.reduce functools.reduce的作用 工作原理 示例 累加序列中的所有元素 计算阶乘 initializer的使用 应用场景 示例:计算平均销售额 小结 4. funct…

使用PyTorch实现LSTM生成ai诗

最近学习torch的一个小demo。 什么是LSTM&#xff1f; 长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;旨在解决传统RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM引入了…

【C++高阶】C++继承学习手册:全面解析继承的各个方面

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模板进阶 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 继承 &#x1f4d6;1. 继承的概念及定义…

【云原生】docker swarm 使用详解

目录 一、前言 二、容器集群管理问题 2.1 docker集群管理问题概述 2.1.1 docker为什么需要容器部署 2.2 docker容器集群管理面临的挑战 三、docker集群部署与管理解决方案 四、Docker Swarm概述 4.1 Docker Swarm是什么 4.1.1 Docker Swarm架构图 4.1.2 Docker Swarm几…

摄影师在人工智能竞赛中与机器较量并获胜

摄影师在人工智能竞赛中与机器较量并获胜 自从生成式人工智能出现以来&#xff0c;由来已久的人机大战显然呈现出一边倒的态势。但是有一位摄影师&#xff0c;一心想证明用人眼拍摄的照片是有道理的&#xff0c;他向算法驱动的竞争对手发起了挑战&#xff0c;并取得了胜利。 迈…

数据资产治理与数据质量提升:构建完善的数据治理体系,确保数据资产的高质量与准确性

一、引言 随着信息技术的迅猛发展&#xff0c;数据已经成为企业和社会发展的重要资产。然而&#xff0c;数据资产的有效治理与数据质量的提升&#xff0c;是企业实现数字化转型、提升竞争力的关键。本文旨在探讨数据资产治理与数据质量提升的重要性&#xff0c;并提出构建完善…

Arnoldi Iteration 思考

文章目录 1. 投影平面2. Arnoldi Iteration3. python 代码 1. 投影平面 假设我们有一个向量q,我们需要关于向量q&#xff0c;构建一个投影平面P&#xff0c;使得给定任何向量v,可以通过公式 p P v pPv pPv&#xff0c;快速得到向量v在投影平面P上的投影向量p. 计算向量内积,…