今天是day8,
題目一:使用棧實(shí)現(xiàn)隊(duì)列

//先實(shí)現(xiàn)一個(gè)棧,給定int數(shù)組一個(gè)別名Mystack
type Mystack []int

//使用引用傳遞值,將v使用append追加至形參s中
func (s *Mystack) Push(v int){
    *s = append(*s,v)
}


//使用val和切片獲取*s的最后一個(gè)元素并調(diào)整*s為當(dāng)前位置并將val返回出,從而實(shí)現(xiàn)了出棧
func (s *Mystack) Pop() int{
    //
    val := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return val
}


//返回最后一個(gè)元素
func (s *Mystack) Peek() int{
    return (*s)[len(*s)-1]
}


func (s *Mystack) Size() int {
    return len(*s)
}

func (s *Mystack) Empty() bool {
    return s.Size() == 0
}
//如上先實(shí)現(xiàn)一個(gè)棧,聲明兩個(gè)數(shù)組一個(gè)in一個(gè)out
type MyQueue struct {
    StackIn *Mystack
    StackOut *Mystack

}

//使用結(jié)構(gòu)體賦值并初始化兩個(gè)數(shù)組為空
func Constructor() MyQueue {
     return MyQueue{
        StackIn: &Mystack{},
        StackOut: &Mystack{},
     }
}


//直接使用棧的push來推進(jìn)元素
func (this *MyQueue) Push(x int)  {
     this.StackIn.Push(x)
}


//先填充out數(shù)組,再讓out數(shù)組彈出
func (this *MyQueue) Pop() int {
    this.fillStackOut()
    return this.StackOut.Pop()

}



func (this *MyQueue) Peek() int {
      this.fillStackOut()
      return this.StackOut.Peek()
}


func (this *MyQueue) Empty() bool {
     return this.StackIn.Empty() && this.StackOut.Empty()
}

//該方法用于填充out數(shù)組
func (this *MyQueue) fillStackOut() {
    if this.StackOut.Empty() {
        for !this.StackIn.Empty() {
            val := this.StackIn.Pop()
            this.StackOut.Push(val)
        }
    }
}
class MyQueue:

    def __init__(self):
        "兩個(gè)用來存放操作數(shù)值的數(shù)組"
        self.stack_in = []
        self.stack_out = []

    "將元素壓入隊(duì)列中"
    def push(self, x: int) -> None:
        self.stack_in.append(x)

                          
    def pop(self) -> int:
        "先判空"
        if self.empty():
            return None
        "這里一個(gè)遞歸"
        if self.stack_out:
            return self.stack_out.pop()
        else:
            "遍歷已有的in數(shù)組并將out數(shù)組值不斷壓入"
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()

    "返回隊(duì)列頭元素,即用ans來獲取pop并將其壓入out數(shù)組中此時(shí)的ans就是第一個(gè)"
    def peek(self) -> int:
        ans = self.pop()
        self.stack_out.append(ans)
        return ans

    "判空即in數(shù)組和out數(shù)組都不存在"
    def empty(self) -> bool:
        return not (self.stack_in or self.stack_out)


題目二:用隊(duì)列實(shí)現(xiàn)棧

from collections import deque
class MyStack:

    def __init__(self):
        "直接聲明兩個(gè)數(shù)組為deque即隊(duì)列"
        self.queue_in = deque()
        self.queue_out = deque()

    
    def push(self, x: int) -> None:
        self.queue_in.append(x)

    "先判空,如果不空,遍歷整個(gè)in隊(duì)列并將其左彈出后再壓入out隊(duì)列中"
    def pop(self) -> int:
        if self.empty():
            return None
        for i in range(len(self.queue_in) - 1):
            self.queue_out.append(self.queue_in.popleft())
        "此時(shí)交換in out隊(duì)列值,最終返回out隊(duì)列的左彈出值"
        self.queue_in,self.queue_out = self.queue_out,self.queue_in
        return self.queue_out.popleft()

    "先判空,再遍歷整個(gè)in隊(duì)列,將其值左彈出后壓入out隊(duì)列中"
    def top(self) -> int:
        if self.empty():
            return None
        for i in range(len(self.queue_in)-1):
            self.queue_out.append(self.queue_in.popleft())
        self.queue_in,self.queue_out = self.queue_out,self.queue_in
        "用temp記錄out隊(duì)列的左彈出值并將其壓入in隊(duì)列中,最后返回temp就是要獲得的值"
        temp = self.queue_out.popleft()
        self.queue_in.append(temp)
        return temp


    def empty(self) -> bool:
        return len(self.queue_in) == 0
from collections import deque
class MyStack:

    def __init__(self):
        self.que = deque()


    def push(self, x: int) -> None:
        self.que.append(x)


    def pop(self) -> int:
        if self.empty():
            return None
        for i in range(len(self.que) - 1):
            self.que.append(self.que.popleft())
        return self.que.popleft()


    def top(self) -> int:
        if self.empty:
            return None
        for i in range(len(self.que) - 1):
            self.que.append(self.que.popleft())
        temp = self.que.popleft()
        self.que.append(temp)
        return temp


    def empty(self) -> bool:
        return not self.que
type MyStack struct {
     queue1 []int
     queue2 []int
}


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


//先將所有元素存儲(chǔ)在queue2中再調(diào)用move來交換元素
func (this *MyStack) Push(x int)  {
     this.queue2 = append(this.queue2,x)
     this.Move()
}

//
func (this *MyStack) Move(){
    if len(this.queue1) == 0{
        //交換,queue1置為queue2,queue2置為空
        this.queue1,this.queue2 = this.queue2,this.queue1
    }else{
        //queue1元素依次從頭開始追加至queue2中
        this.queue2 = append(this.queue2,this.queue1[0])
        this.queue1 = this.queue1[1:]//去除第一個(gè)元素
        this.Move()//遞歸
    }
}


func (this *MyStack) Pop() int {
    val:=this.queue1[0]
    this.queue1 = this.queue1[1:]
    return val
}


func (this *MyStack) Top() int {
     return this.queue1[0]
}


func (this *MyStack) Empty() bool {
    return len(this.queue1) == 0
}
type MyStack struct {
     queue []int
}


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


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


func (this *MyStack) Pop() int {
    n:=len(this.queue) -1
    for n!=0{
        //從隊(duì)列中獲取第一個(gè)元素(即棧頂元素),將其保存到變量 val 中
        val:=this.queue[0]
        //移除隊(duì)列中的第一個(gè)元素,即將隊(duì)列的切片重新賦值為從索引 1 開始到末尾的部分,這樣就移除了第一個(gè)元素。
        this.queue = this.queue[1:]
        //將剛才移除的元素重新追加到隊(duì)列的末尾。這個(gè)操作相當(dāng)于將元素從隊(duì)列的頭部移動(dòng)到尾部,實(shí)現(xiàn)了棧的出棧操作。
        this.queue = append(this.queue,val)
        //在每次循環(huán)結(jié)束時(shí),將 n 的值減 1,以便逐步減少隊(duì)列中的元素?cái)?shù)量。
        n--
    }
    //在循環(huán)結(jié)束后,隊(duì)列中只剩下最后一個(gè)元素,因此我們直接取出這個(gè)元素。
    val:=this.queue[0]
    //將隊(duì)列中的最后一個(gè)元素移除。
    this.queue = this.queue[1:]
    return val
}


func (this *MyStack) Top() int {
     val:=this.Pop()
     this.queue = append(this.queue,val)
     return val
}


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