用两个栈来实现队列

用两个栈来实现队列

今天开始是我第一天在Leetcode上写题,我打算坚持保证每天至少一道,所以,我会通过每天一篇博客的方式来记录,并加以监督,话不多说,开始今天的练习。

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]

示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

class CQueue {
	
public:
    CQueue() {}
    void appendTail(int value) {
   
    }
    int deleteHead() {
    	
    }
};

这是给出的代码片段

思路:
加入队尾 appendTail()函数: 将数字 val 加入栈 Fr即可。
删除队首deleteHead()函数: 有以下三种情况:
当栈 Re不为空: Re中仍有已完成倒序的元素,因此直接返回 Re的栈顶元素。
否则,当 Fr为空: 即两个栈都为空,无元素,因此返回 −1 。
否则: 将栈 Fr 元素全部转移至栈 Re 中,实现元素倒序,并返回栈 Re 的栈顶元素

代码实现

class CQueue {
public:
   stack<int> Fr,Re;
    CQueue() {

    }
    
    void appendTail(int value) {//添加就直接在正的栈压入就行
      Fr.push(value); 
    }
    
    int deleteHead() {
     if(Re.empty()){       //倒的栈(reserve)为空,就把正的栈(front)弹出并压入倒的栈
         while(!Fr.empty()){
         Re.push(Fr.top());
         Fr.pop();}
     }
     
     if(Re.empty()){ //倒的栈还为空,就说明无元素,输出-1
    	return -1;
	}
	else{             //其他情况直接弹出倒的栈
	   int res=Re.top();
       Re.pop();
       return res;
       }
     }       
};

时间复杂度:我们可以看出appendTail()函数为 O(1);deleteHead() 函数在 N次队首元素删除操作中总共需完成 N 个元素的倒序。
空间复杂度:很明显我们用的了两个栈,所以空间复杂度为O(n)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值