c语言实现队列

C语言实现队列

我的stack和queue都是用双向链表实现的,感觉链表实现起来容易一点,特别是不用注重考虑扩容的事情,这样一想java的hashmap实现确实挺重要的,怪不得经常面试的时候问起来。有机会就分享一下hashmap的源码吧。目前来说cJSON是我下一个想实现的,牵涉到二叉树和递归。
先说这个队列吧,实在是简单。

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

实现 MyQueue 类:

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

说明:

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

进阶:

你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。
 

示例:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
 

提示:

1 <= x <= 9
最多调用 100 次 push、pop、peek 和 empty
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/queue-stack/gvtxe/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

C语言实现,原则就是能跑过leetcode就行,但是显然leetcode某些方面对代码的NULL判断会弱一点,比如对空队列pop,所以就当是娱乐一下吧。

#include <stdlib.h>
typedef int ELEMENT;
typedef struct node{
    ELEMENT x;
    struct node * next;
    struct node * prev;
}Node;

typedef struct {
    Node * head;
    Node * rear;
} MyQueue;

/** Initialize your data structure here. */

MyQueue* myQueueCreate() {
    MyQueue * q = malloc(sizeof(MyQueue));
    q -> head = NULL;
    q -> rear = NULL;
    return q;
}

Node * Node_init(int t)
{
    Node * node = malloc(sizeof(Node));
    node -> x = t;
    node -> prev = NULL;
    node -> next = NULL;
    return node;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
    Node * node = Node_init(x);
    if(obj==NULL)
        return;
    if(obj -> head == NULL)
    {
        obj -> head = node;
        obj -> rear = node;
    }
    else
    {
        obj -> rear -> next = node;
        node -> prev = obj -> rear; //将最后节点prev向前指向obj->rear
        obj -> rear = node;
    }
}

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {
        int ret = obj -> head ->x;
        Node * t = obj -> head;
        obj -> head = t -> next;
        free(t);
        return ret;
}

/** Get the front element. */
int myQueuePeek(MyQueue* obj) {
    return obj->head->x;
}

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {
    return (obj->head == NULL);
}

void myQueueFree(MyQueue* obj) {
    while(obj->head != NULL)
    {
        myQueuePop(obj);
    }
    free(obj);
}

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

感觉双向链表可以解决很多问题,但是类似于cJSON这种,需要parse JSON字符串,虽然是对字符串的处理,但其实也有点难度。freewheel当时二面面试我就是问的类似于JSON的处理,希望两周之内可以实现一个cJSON吧。需要补充一下二叉树的知识了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值