leetcode刷题937-12 | Implement Queue using Stacks

本文详细介绍了一种使用堆栈实现队列数据结构的方法,包括push、pop、peek和empty等核心操作的实现细节,提供了完整的C代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目解读:

使用堆栈实现以下操作:

1.push(x):将元素x加入队列

2.pop():取出第一个元素

3.peek():求第一个元素的值

4.empty():判空操作

示例:

MyQueue queue = new MyQueue();

queue.push(1);

queue.push(2);

queue.peek(); // returns 1

queue.pop(); // returns 1

queue.empty(); // returns false

解题思路:

该题的主要是要实现题目要求的函数; 我将在代码中通过注释详细说明。

注意点:在对队列进行操作时,如果有遇到结点的增添,删除等等操作时,要注意结点数据结构的完整性,即要对数据结构中的每个元素进行操作。

c代码(含注释):

typedef struct MyQueueData;

typedef struct QueueData {//数据结构
    int data;//数据
    struct QueueData* next;//下一个数据的位置
    struct QueueData* prev;//上一个数据的位置
} MyQueueData;

typedef struct {
    MyQueueData* head;//队头元素的位置
    MyQueueData* tail;//队尾元素的位置
    int size;//队列当前的长度
    int maxSize;//队列的最大长度
} MyQueue;

/** Initialize your data structure here. */
MyQueue* myQueueCreate(int maxSize) {
    MyQueue* queue = (MyQueue*) malloc(sizeof(MyQueue));//动态创建队列空间
    memset(queue, 0, sizeof(MyQueue));//初始化
    queue->maxSize = maxSize;//设置数组的最大长度
    return queue;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
    if (obj->size == obj->maxSize) {//如果当前长度等于最大长度,则执行空操作
        return;
    }

    MyQueueData* Data = (MyQueueData*) malloc(sizeof(MyQueueData));//创建新的数据空间
    memset(Data, 0, sizeof(MyQueueData))//初始化data;
   Data->data = x;//将x赋值于data

    if (obj->size > 0) {//当obj的长度为空时,将Data加入队列末尾,并将尾指针指向Data
        Data->prev = obj->tail;
        Data->prev->next =Data;
        obj->tail = Data;
    } 
		else {//当obj的长度不为空时,头指针于尾指针都指向Data
        obj->head = Data;
        obj->tail = Data;
    }

    ++obj->size;//obj的长度加1
}

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {
    if (obj->size == 0) {//如果当前长度等于最大长度,则返回0;
        return 0;
    }

    MyQueueData* head = obj->head;//找到obj的第一个元素的指针
    int data = head->data;//将第一个元素的数据赋值给data
    if (head->next) {//如果head的下一个地址存在
        head->next->prev = 0;//将下一个地址的pre置为空
    }
    obj->head = head->next;//head指针指向head的下一个地址

    free(head);//释放head的空间
    
    --obj->size;//obj的长度减1

    return data;
}

/** Get the front element. */
int myQueuePeek(MyQueue* obj) {
    if (obj->size == 0) {//如果当前长度等于0,返回0;
        return 0;
    }
    return obj->head->data;//否则返回第一个结点的data值
}

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {
    return obj->size == 0;//如果当前长度等于false,否则返回true
}

void myQueueFree(MyQueue* obj) {//清空队列操作
    while (obj->head) {//如果头指针为空,则循环继续
        MyQueueData* next = obj->head->next;//找到下一个地址
        free(obj->head);//释放头指针
        obj->head = next;//头指针指向下一个地址
    }
    free(obj);//释放obj
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * struct MyQueue* obj = myQueueCreate(maxSize);
 * myQueuePush(obj, x);
 * int param_2 = myQueuePop(obj);
 * int param_3 = myQueuePeek(obj);
 * bool param_4 = myQueueEmpty(obj);
 * myQueueFree(obj);
 */

 

校园失物招领微信小程序源码, 失物招领小程序主要为解决大学生时常丢失物品而且很难找回以及归还过程繁琐不方便的问, 与传统的失物招领方式不同,该款校园失误招领小程序拥有快捷发布寻物启事和失误找领功能, 快速查找、极速归还、高效沟通、防误领冒领等功能, 在开发校园失物招领小程序前与用户访谈发现有近40的同学校园内频繁丢失物品、证件、校园卡等, 数码产品、日用品等,丢失区域主要发生在教学楼、图书馆和食堂。 拾领校园失物招领小程序继承了寻物启事和失物招领,丢失物品或拾取物品都可发布帖子, 首页的横幅滚动公告展示通知公告等,banner图片化的方式更具有视觉吸引力, 最新信息可显示最近发布的招领信息或寻物信息,更加方便快捷的展示信息, 用户可通过首页的发布按钮发布帖子,发布者只需填写物品的相关信息,类别、地点等相关信息, 并且可以填写手机号开启认领验证,并可以一键生成二维码分享或分享至群聊和朋友圈。 列表内可以筛选物品类别或精确搜索,物品详情里可展示物品的相关信息, 确认是自己的物品后可点击认领,然后验证信息,需填写物品的关键信息以作辨认, 防止冒领误领,物品详情页可生成二维码海报分享,还有即时的消息联系功能以提高沟通效率, 发布者还可选择放置在代收处,双方还可以通过拨打电话紧急联系,用于紧急情况,让失物找到主人, 个人中心可以管理发布的物品帖子,管理个人信息,包括昵称、默认学校、手机号的修改、 编辑发布的物品帖子、获取帮助等。帮助用户流畅的使用该小程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值