劍指 Offer 09. 用兩個棧實現隊列

劍指 Offer 09. 用兩個棧實現隊列

用兩個棧實現一個隊列。隊列的聲明以下,請實現它的兩個函數 appendTaildeleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操做返回 -1 )golang

示例 1:app

輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]

示例 2:函數

輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]

思路

golang

須要一個輸入棧stackIn和一個輸出棧stackOut來進行模擬ui

對於隊列的appendTail操做,咱們只需在輸入棧stackIn中push便可this

對於隊列的deleteHead操做,相對複雜一些,若是輸出棧stackOut爲空,則將輸入棧中的元素所有導入輸出棧stackOut中,再從輸出棧中pop,若是輸出棧不爲空,則直接pop輸出棧中元素prototype

/*須要一個輸入棧stackIn和一個輸出棧stackOut來進行模擬*/
type CQueue struct {
	stackInt []int
	stackOut []int
}

func Constructor() CQueue {
	return CQueue{}
}

//在隊列尾部插入整數
//對於隊列的appendTail操做,咱們只需在輸入棧stackIn中push便可
func (this *CQueue) AppendTail(value int) {
	this.stackInt = append(this.stackInt, value)
}

//在隊列頭部刪除整數
/*對於隊列的deleteHead操做,相對複雜一些,若是輸出棧stackOut爲空,則將輸入棧中的元素所有導入輸出棧stackOut中,再從輸出棧中pop,若是輸出棧不爲空,則直接pop輸出棧中元素*/
func (this *CQueue) DeleteHead() int {
	//隊列中沒有元素 DeletedHead返回-1
	if len(this.stackInt) == 0 && len(this.stackOut) == 0 {
		return -1
	}

	if len(this.stackOut) == 0 {
		//輸出棧爲空 則將輸入棧中的元素所有導入到輸出棧中,再刪除
		for len(this.stackInt) != 0 {
			//獲取輸入棧棧頂元素並刪除
			val := this.stackInt[len(this.stackInt)-1]
			this.stackOut = append(this.stackOut, val)
			this.stackInt = this.stackInt[:len(this.stackInt)-1]
		}
	}
	//輸出棧不爲空,直接刪除隊列頭元素
	val := this.stackOut[len(this.stackOut)-1]
	this.stackOut = this.stackOut[:len(this.stackOut)-1]
	return val
}

/**
 * Your CQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.AppendTail(value);
 * param_2 := obj.DeleteHead();
 */

js

var CQueue = function() {
    this.stackInt = [];//輸入棧
    this.stackOut = [];//輸出棧
};

/** 
 * @param {number} value
 * @return {void}
 */
//追加元素到隊列尾部操做
CQueue.prototype.appendTail = function(value) {
    //直接追加元素到輸入棧中
    this.stackInt.push(value)
};

/**
 * @return {number}
 */
//刪除隊列首部元素
CQueue.prototype.deleteHead = function() {
    //若是隊列元素爲空 返回-1
    if(this.stackInt.length===0&&this.stackOut.length===0) return -1;
    //若是輸出棧爲空 則先將輸入棧中的元素導入到輸出棧中再進行刪除
    if(this.stackOut.length==0){
        //獲取輸入棧棧頂元素 追加到輸出棧中並刪除棧頂元素
        while (this.stackInt.length!=0) 
            this.stackOut.push(this.stackInt.pop())
    }
    //刪除隊首元素 並返回
    return this.stackOut.pop()
};

/**
 * Your CQueue object will be instantiated and called as such:
 * var obj = new CQueue()
 * obj.appendTail(value)
 * var param_2 = obj.deleteHead()
 */
相關文章
相關標籤/搜索