用栈实现队列

问题描述:

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

实现 MyQueue 类:

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

思路:

因为go语言没有栈的结构体,直接用一维切片模拟栈。
stack:进入的栈,
back: 输出的栈
push:直接导入
pop:判断当前输出栈是否为空,不为空直接导出,为空将stack导入进back
empty:直接判断两个栈是否为空
代码:

//结构体,包含两个一维切片
type MyQueue struct {
    stack []int
    back []int
}

//初始化,
func Constructor() MyQueue {
    return MyQueue {
        stack: make([]int ,0 ),
        back: make([]int, 0),
    }
}


func (this *MyQueue) Push(x int)  {
    this.stack = append(this.stack,x)
}


func (this *MyQueue) Pop() int {
    if len(this.back) == 0 {
        for len(this.stack) != 0 {
            val := this.stack[len(this.stack)-1]
            this.stack = this.stack[:len(this.stack)-1] //切片,更新栈
            this.back = append(this.back, val)
        }
    }
    val := this.back[len(this.back)-1]
    this.back = this.back[:len(this.back)-1]
    return val
}


func (this *MyQueue) Peek() int {
    // this.
    if len(this.back) == 0 {
        for len(this.stack) != 0 {
            val := this.stack[len(this.stack)-1]
            this.stack = this.stack[:len(this.stack)-1]
            this.back = append(this.back, val)
        }
    }
    val := this.back[len(this.back)-1]
    return val
}


func (this *MyQueue) Empty() bool {
    return len(this.back)==0 && len(this.stack)==0
}


用队列实现栈

问题描述:

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

思路:

同理,go也没有队列的结构体,直接干。
可以使用一个队列,将除了尾部元素都移到尾部。

代码:

type MyStack struct {
    que []int
}


func Constructor() MyStack {
    return MyStack {
        que: make([]int, 0),
    }
}


func (this *MyStack) Push(x int)  {
    this.que= append(this.que,x)
}


func (this *MyStack) Pop() int {
    l := len(this.que)-1
    for l>0 {
        tem := this.que[0]
        this.que = this.que[1:]
        this.que = append(this.que,tem) 
        l--
    }
    res := this.que[0]
    this.que = this.que[1:]
    return res
}


func (this *MyStack) Top() int {
    // return this.que[len(this.que)-1]
    val := this.Pop()
    this.que = append(this.que,val)
    return val
}


func (this *MyStack) Empty() bool {
    return len(this.que) ==0
}