leetcode: Implement Queue using Stacks

使用satck实现queue

我使用的是 单向链表 实现的queue.

考察的是基本的数据结构的实现。

为了实现pop 和push 操作,需要设计两个指针(我代码中成了首位两个节点),一个只想第一个元素,另一个只想最后一个元素,以便快速实现pop和push操作。

结构体Node中的默认构造函数,也算是一个知识点吧。


同一段代码,中午提交没通过,晚上一点没改再次提交竟然通过了。。。。真是没脾气。

发现一个问题,pop操作时,如果queue为空,应该返回false.

代码如下:

class MyQueue {
public:
    struct Node{
        int data;
        Node* ptr;
        Node(const int x=0,Node* p=NULL):data(x),ptr(p){}
    };
    /** Initialize your data structure here. */
    MyQueue() {
        size=0;
        head=new Node;
        tail=new Node;
        head->ptr=tail;
        tail->ptr=head;   
    }   

    /** Push element x to the back of queue. */
    void push(int x) {
        if(empty()){
            head->ptr=new Node(x,tail);
            tail->ptr=head->ptr;
        }
        else{
            tail->ptr->ptr=new Node(x,tail);
            tail->ptr=tail->ptr->ptr;
        }
        ++size;
    }   

    /** Removes the element from in front of queue and returns that element. */
    int pop() {
        int ret=head->ptr->data;
        Node* tmp=head->ptr;
        head->ptr=tmp->ptr;
        delete tmp;
        --size;
        return ret;
    }   
    /** Get the front element. */
    int peek() {
        return head->ptr->data;
    }   

    /** Returns whether the queue is empty. */

    bool empty() {
        return size==0?true:false;
    }   
private:
    unsigned int size;
    Node* head;
    Node* tail;
};



/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * bool param_4 = obj.empty();
 */

修改成指针之后:

class MyQueue{
public:
    struct Node{
        int data;
        Node* ptr;
        Node(int x=0,Node* p=NULL):data(x),ptr(p){}
    };
    
    MyQueue(){
        size=0;
        head=NULL;
        tail=NULL;        
    }
    int pop()
    {
        if(empty())
            return false;
        int ret=head->data;
        Node* tmp=head->ptr;
        delete head;
        --size;
        head=tmp;
        return ret;       
    }
    void push(int x)
    {
        if(empty())
        {
            head=new Node(x,nullptr);
            tail=head;
        }
        else
        {
            tail->ptr=new Node(x,nullptr);
            tail=tail->ptr;
        }
        ++size;
    }
    int peek()
    {
        return head->data;
    }   
    bool empty()
    {
        return size==0?true:false;
    }
private:
    Node* head;
    Node* tail;
    unsigned int size;    
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值