剑指offer(6)——用两个栈实现队列

150 阅读2分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路 用栈a来对push内容进行存储(队列是先进先出,而栈是先进后出,最先进去的在栈的最底下,而队列要最先进去的在最上面,所以把stack1栈里面的一个个压倒stack2里面这样最下面的在stack2里面反而是最上面)当需要pop时,先判断栈b里是否有数值,若有则直接pop;若没有则先将栈a中的元素全部push进栈b中,再将栈b顶端元素pop出来。

1 队列的功能介绍 队列的功能就是FIFO(先进先出)原则。不管是队列还是栈,他们的功能都是存储数据,底层实现可以数组也可以是链表,但是他们各自有他们的特点。既然队列也是存储数据的一种数据结构,那么他就有增删改查等功能。队列的添加元素是在队尾添加,删除元素是在队头删除。

下面介绍一下队列的增删改查操作:

push(int x):在队列尾部添加一个元素 pop():删除队列头部第一个元素 empty():判断是否为空队列 peek():获取队列头部元素 2 栈的功能介绍 栈也是一种存储数据的数据结构,和队列不同的是,这是一种FILO(先进后出)的数据结构,插入和删除都在栈顶完成。

下面介绍一下的栈的增删改查操作:

push(int x):向栈中插入一个元素 pop():删除栈顶元素 top():获得栈顶元素,打印,不删除 empty():判断是否为空 3 栈实现队列的原理介绍 3.1 方式1原理介绍 方式1将栈A作为最终的栈,即栈A中的元素排序和队列中的排序一致,此种方式在push元素入队列时,需要同时操作两个栈,比较消耗时间和空间,但是其他的操作(比如pop,top等)就不会消耗太多的时间和空间资源了。

var CQueue = function() {
    this.stack1 = [];
    this.stack2 = [];
   };
   
   /** 
    * @param {number} value
    * @return {void}
    */
   CQueue.prototype.appendTail = function(value) {
       this.stack1.push(value)
   };
   
   /**
    * @return {number}
    */
   CQueue.prototype.deleteHead = function() {
       if(this.stack2.length>0) {
           return this.stack2.pop()
       } 
       if(this.stack1.length == 0) {
           return -1
       } else {
           while(this.stack1.length !== 0) {
               this.stack2.push(this.stack1.pop())
           }
           return this.stack2.pop()
          
       }
   };
   
   /**
    * Your CQueue object will be instantiated and called as such:
    * var obj = new CQueue()
    * obj.appendTail(value)
    * var param_2 = obj.deleteHead()
    */

运行截图 在这里插入图片描述