当前位置: 首页 > news >正文

烟台市政建设招标网站自己电脑做网站必须装jdk

烟台市政建设招标网站,自己电脑做网站必须装jdk,上海建科工程咨询有限公司,佛山建站公司排名LeetCode 232: 用栈实现队列 题目描述 使用栈实现队列的操作。支持以下操作: MyQueue():初始化队列。push(x):将元素 x 推入队列。pop():从队列中移除元素。peek():返回队列头部的元素。empty():检查队列…

LeetCode 232: 用栈实现队列

题目描述

使用栈实现队列的操作。支持以下操作:

  1. MyQueue():初始化队列。
  2. push(x):将元素 x 推入队列。
  3. pop():从队列中移除元素。
  4. peek():返回队列头部的元素。
  5. empty():检查队列是否为空。

队列的先进先出(FIFO)原则可以通过两个栈来模拟。栈 A 用于入队操作,栈 B 用于出队操作。

C 语言实现

#include <stdio.h>
#include <stdlib.h>// 定义栈结构体
typedef struct {int* data;int top;int capacity;
} Stack;// 初始化栈
Stack* stackCreate(int capacity) {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->data = (int*)malloc(sizeof(int) * capacity);stack->top = -1;stack->capacity = capacity;return stack;
}// 检查栈是否为空
int stackIsEmpty(Stack* stack) {return stack->top == -1;
}// 入栈操作
void stackPush(Stack* stack, int x) {stack->data[++stack->top] = x;
}// 出栈操作
int stackPop(Stack* stack) {return stack->data[stack->top--];
}// 获取栈顶元素
int stackTop(Stack* stack) {return stack->data[stack->top];
}// 释放栈内存
void stackFree(Stack* stack) {free(stack->data);free(stack);
}// 定义队列结构体
typedef struct {Stack* stackA;Stack* stackB;
} MyQueue;// 初始化队列
MyQueue* myQueueCreate() {MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));queue->stackA = stackCreate(100); // 栈 A 的初始容量queue->stackB = stackCreate(100); // 栈 B 的初始容量return queue;
}// 入队操作
void myQueuePush(MyQueue* obj, int x) {stackPush(obj->stackA, x);  // 将元素推入栈 A
}// 出队操作
int myQueuePop(MyQueue* obj) {if (stackIsEmpty(obj->stackB)) {  // 如果栈 B 为空while (!stackIsEmpty(obj->stackA)) {  // 将栈 A 中的元素全部移到栈 BstackPush(obj->stackB, stackPop(obj->stackA));}}return stackPop(obj->stackB);  // 从栈 B 出栈
}// 获取队列头部元素
int myQueuePeek(MyQueue* obj) {if (stackIsEmpty(obj->stackB)) {  // 如果栈 B 为空while (!stackIsEmpty(obj->stackA)) {  // 将栈 A 中的元素全部移到栈 BstackPush(obj->stackB, stackPop(obj->stackA));}}return stackTop(obj->stackB);  // 返回栈 B 顶部元素
}// 检查队列是否为空
int myQueueEmpty(MyQueue* obj) {return stackIsEmpty(obj->stackA) && stackIsEmpty(obj->stackB);  // 栈 A 和栈 B 都为空时队列为空
}// 释放队列内存
void myQueueFree(MyQueue* obj) {stackFree(obj->stackA);stackFree(obj->stackB);free(obj);
}// 测试主函数
int main() {MyQueue* queue = myQueueCreate();myQueuePush(queue, 1);myQueuePush(queue, 2);printf("peek: %d\n", myQueuePeek(queue));  // 应输出 1printf("pop: %d\n", myQueuePop(queue));   // 应输出 1printf("empty: %d\n", myQueueEmpty(queue));  // 应输出 0myQueuePush(queue, 3);printf("peek: %d\n", myQueuePeek(queue));  // 应输出 2printf("pop: %d\n", myQueuePop(queue));   // 应输出 2printf("pop: %d\n", myQueuePop(queue));   // 应输出 3printf("empty: %d\n", myQueueEmpty(queue));  // 应输出 1myQueueFree(queue);return 0;
}

代码逐行解释

栈的实现

typedef struct {int* data;int top;int capacity;
} Stack;

我们首先定义了一个 Stack 结构体,包含了三个成员:

  • data:存储栈元素的数组。
  • top:栈顶元素的索引。
  • capacity:栈的最大容量。
Stack* stackCreate(int capacity) {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->data = (int*)malloc(sizeof(int) * capacity);stack->top = -1;stack->capacity = capacity;return stack;
}

stackCreate 用来初始化一个栈,分配内存并设置初始值。

int stackIsEmpty(Stack* stack) {return stack->top == -1;
}

stackIsEmpty 用于检查栈是否为空,栈空时返回 1

void stackPush(Stack* stack, int x) {stack->data[++stack->top] = x;
}

stackPush 用于将元素推入栈中,top 先自增再将元素存入。

int stackPop(Stack* stack) {return stack->data[stack->top--];
}

stackPop 用于从栈中弹出元素,并返回弹出的元素。

int stackTop(Stack* stack) {return stack->data[stack->top];
}

stackTop 用于获取栈顶元素,但不删除它。

队列的实现

typedef struct {Stack* stackA;Stack* stackB;
} MyQueue;

我们定义了一个 MyQueue 结构体,它包含两个栈:

  • stackA 用于存储入队元素。
  • stackB 用于存储出队元素。
MyQueue* myQueueCreate() {MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));queue->stackA = stackCreate(100); queue->stackB = stackCreate(100); return queue;
}

myQueueCreate 用于创建一个队列并初始化其中的两个栈。

void myQueuePush(MyQueue* obj, int x) {stackPush(obj->stackA, x);  
}

myQueuePush 将元素压入 stackA

int myQueuePop(MyQueue* obj) {if (stackIsEmpty(obj->stackB)) {while (!stackIsEmpty(obj->stackA)) {stackPush(obj->stackB, stackPop(obj->stackA));}}return stackPop(obj->stackB);
}

myQueuePop 用于从队列中弹出元素。首先检查 stackB 是否为空,如果为空,则将 stackA 中的所有元素转移到 stackB 中。然后从 stackB 弹出栈顶元素。

int myQueuePeek(MyQueue* obj) {if (stackIsEmpty(obj->stackB)) {while (!stackIsEmpty(obj->stackA)) {stackPush(obj->stackB, stackPop(obj->stackA));}}return stackTop(obj->stackB);
}

myQueuePeek 用于获取队列头部的元素,逻辑与 myQueuePop 相同,只不过不移除元素。

int myQueueEmpty(MyQueue* obj) {return stackIsEmpty(obj->stackA) && stackIsEmpty(obj->stackB);
}

myQueueEmpty 检查队列是否为空,只有当 stackAstackB 都为空时,队列才为空。

void myQueueFree(MyQueue* obj) {stackFree(obj->stackA);stackFree(obj->stackB);free(obj);
}

myQueueFree 用于释放队列及其内部栈的内存。

http://www.dtcms.com/a/419818.html

相关文章:

  • 基于IMX6ULL芯片--I2C总线简单应用
  • 360网站卫士代备案流程推广员是什么工作
  • 特别分享:LangChain——构建强大LLM应用的“万能胶水”
  • 硬件开发2-ARM裸机开发3-I.MX6ULL - 时钟、定时器
  • Information Fusion | Modal-NexT:统一的多模态细胞数据整合
  • 医院信息化建设网站梵克雅宝手链
  • seo建站的步骤刷关键词排名
  • 初识网站开发流程图石家庄新闻发布会直播
  • 网站推广在哪些平台做外链微商刚起步怎么找客源
  • 怎样做化妆品公司网站wordpress 免费企业网站 模板下载
  • 禅道 v21.7.5 Docker 一键部署
  • 外国大气网站手机网站建设多钱
  • 数据库缓存双写一致性的实现方案
  • 做网站的需求调研深圳品牌营销咨询公司
  • 网站建设一般做什么网络营销方案设计心得
  • NXP MPC5777M LINFlexD 模块配置为 UART 模式详解(基于 PowerPC 架构)
  • 商务网站主页设计公司沈阳世纪兴网站制作
  • 织梦做网站主页容易吗怎么建立自己的网站平台多少钱
  • 新乡商城网站建设网站程序开发教程
  • 《计算》第七八章读书笔记
  • 全屏网站 内页怎么做网站搭建是什么专业学的
  • 现代企业网站建设特点如何学好网站建设
  • 网站建设推广案例wordpress多重标签
  • C语言入门知识点(13.指针篇结局与易混淆类型)
  • 题解:AT_abc424_e [ABC424E] Cut in Half
  • 突破!再次新增【钓鱼邮件检测】能力
  • 闵行营销型网站建设tk网站注册
  • 西安做门户网站最好的公司手机app制作用什么软件
  • 【网络安全】二、入门篇:HTTP 协议进阶 ——GET/POST 常用传参方法详解
  • Apache Shiro 技术详解