【GO】剑指 09

79 阅读2分钟

image.png

题意
["CQueue","appendTail","deleteHead","deleteHead"] 
这一行表示每一行代码的操作

[[],[3],[],[]]
这个表示每一行代码操作所需要的参数

举例:
CQueue 表示新建一个CQueue对象(队列),对应的所需参数为[],即此操作不需要参数。
appendTail 表示执行一个appendTail()操作,对应要被操作的元素为3。
deleteHead 表示执行一个deleteHead()操作,对应的所需参数为[],即此操作不需要参数。

以上的输入其实是一个代码执行的步骤描述与其对应所需参数。

即两个纬度:
1、操作描述
2、此次操作所需参数
3、操作描述与操作所需参数是通过默认顺序一一对应的
实例1
输入:
        ["CQueue","appendTail","deleteHead","deleteHead"]
        [[],[3],[],[]]
输出:
        [null,null,3,-1]
1.创建队列,返回值为null

2.3压入栈,返回值为null

3.将栈底的元素删除,也就是消息队列中先进来的元素,所以是deleteHead,
返回该元素的数值,所以为3

4.继续删除栈底的元素,但是没有元素了,所以返回-1

所以就有了下面的输出 输出:[null,null,3,-1]
解题
type CQueue struct {
    // 在CQueue队列结构体中创建两个切片(栈)
    in []int
    out []int
}
// 通过Constructor函数返回CQueue结构体,起初始化作用
func Constructor() CQueue {
    return CQueue{}
}
// 选取in栈作为添加操作
func (this *CQueue) AppendTail(value int)  {
    this.in = append(this.in, value)
}
// 删除头一个节点
func (this *CQueue) DeleteHead() int {
    // 如果两个栈全部为空。返回-1
    if len(this.out) == 0 && len(this.in)==0{
        return -1
    
    // 如果出栈为空,且入栈不为空
    if len(this.out) == 0{
        if len(this.in) != 0{
            for len(this.in)>0 {
                // 取出入栈的最后一个元素索引
                index := len(this.in)-1
                // 取出入栈的最后一个元素
                value := this.in[index]
                // 切分并获取入栈最后一个元素之前的所有元素
                this.in = this.in[:index]
                // 将入栈的最后一个元素存入出栈中
                this.out = append(this.out, value)
            }
        }
    }
    // 获取出栈的最后一个元素索引
    outindex := len(this.out) - 1
    // 获取出栈的最后一个元素
    outvalue := this.out[outindex]
    // 切分并获取出栈最后一个元素之前的所有元素
    this.out = this.out[:outindex]
    //将出栈的最后一个元素作为返回值返回
    return outvalue
}