Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// 题目链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/
// 思路:建立辅助栈,与存储数据的栈大小相同,在向栈中存数据时,辅助栈同时存入一个数字
// 该辅助栈入栈元素的序列是一个非严格递增序列
// 如果该数据小于辅助栈栈顶元素,则辅助栈存入该数据,否则辅助栈还存入一个辅助栈的栈顶元素。
//(如果是存入第一个元素,辅助栈直接入栈即可,无比较操作)

package main

type MinStack struct {
nums []int //储存栈
min []int //辅助储存栈,存储最小值
}

/** initialize your data structure here. */
// 为解决命名冲突,这里函数名后+“2”,在LeetCode需删除
func Constructor2() MinStack {
return MinStack{
[]int{},
[]int{},
}
}

// 入栈时,存储栈直接入栈
// 对辅助栈,若栈长度为0,直接入栈
// 否则,与栈顶元素进行比较,若大于栈顶元素,入栈,否则,辅助栈再次存入栈顶元素
func (this *MinStack) Push(x int) {
this.nums=append(this.nums,x)
if len(this.min)==0{
this.min=append(this.min,x)
}else if this.min[len(this.min)-1]<x{
this.min=append(this.min,this.min[len(this.min)-1])
}else{
this.min=append(this.min,x)
}
}

// 出栈时,两栈均常规出栈即可
func (this *MinStack) Pop() {
this.nums=this.nums[:len(this.nums)-1]
this.min=this.min[:len(this.min)-1]
}

// 返回存储栈栈顶元素
func (this *MinStack) Top() int {
return this.nums[len(this.nums)-1]
}

// 求min值时,返回辅助栈栈顶元素即可
func (this *MinStack) Min() int {
return this.min[len(this.min)-1]
}

/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(x);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.Min();
*/
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
// 题目链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/?envType=study-plan&id=lcof
// day1/31
// 第一天主题为:栈与队列(简单)
// 包含两道题目:
// 剑指offer09:用两个栈实现队列
// 剑指offer30.包含min函数的栈

//这题太经典了,两个栈实现队列。思路:两个栈,一个用来入栈(支持插入操作),一个用来出栈(支持删除操作),
//栈的特点是先进后出,队列是先进先出,不考虑中间的出入,那一批数据通过栈和队列后的顺序的刚好相反的。我
//们需要将栈的先进后出再倒一次顺序,就和队列的顺序相同了。
//
//官方描述:根据栈先进后出的特性,我们每次往第一个栈里插入元素后,栈顶是最后插入的元素,栈底是下一个待删除的元素。
//为了维护队列先进先出的特性,我们引入第二个栈,用第二个栈维护待删除的元素,在执行删除操作的时候我们首先看下第二个栈是否为空。
//如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,
//这样第二个栈里元素的顺序就是待删除的元素的顺序,要执行删除操作的时候我们直接弹出第二个栈的元素返回即可。

//具体实现:维护两个栈stack1和stack2,其中,stack1用来入队,stack2用于出队,初始时,两个栈均为空,插入元素时,stack1 插入元素即可
//删除元素时,若stack2为空,将stack1所有元素出栈至stack2,若stack2仍然为空,返回-1,否则,从stack2出栈一个元素并返回。
package main

// stack1与stack2分别用于入队和出队
type CQueue struct {
stack1 []int
stack2 []int
}

// 构造函数,初始时,两个栈均为空
func Constructor() CQueue {
return CQueue{[]int{},[]int{}}
}

// stack1用于入队
func (this *CQueue) AppendTail(value int) {
this.stack1 = append(this.stack1,value)
}

// stack2用于出队
func (this *CQueue) DeleteHead() int {
// 若stack2长度为0,将stack1所有元素出栈至stack2
if len(this.stack2) == 0{
for len(this.stack1) > 0{
x := this.stack1[len(this.stack1)-1]
this.stack2 = append(this.stack2,x)
this.stack1 = this.stack1[:len(this.stack1)-1]
}
}
// stack2出栈的元素即为队首元素
if len(this.stack2) > 0{
res := this.stack2[len(this.stack2)-1]
this.stack2 = this.stack2[:len(this.stack2)-1]
return res
}
// 若stack2长度仍为0,说明队列为空,返回-1
return -1
}


/**
* Your CQueue object will be instantiated and called as such:
* obj := Constructor();
* obj.AppendTail(value);
* param_2 := obj.DeleteHead();
*/
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// 题目解析在 用两个栈实现队列.go
// 本文件为 用链表实现的栈 来 实现队列
// 为解决命名冲突,本文件结构体与函数名后+1
package main

import "container/list"

type CQueue1 struct {
stack1, stack2 *list.List
}

func Constructor1() CQueue1 {
return CQueue1{
stack1: list.New(),
stack2: list.New(),
}
}

func (this *CQueue1) AppendTail1(value int) {
this.stack1.PushBack(value)
}

func (this *CQueue1) DeleteHead1() int {
if this.stack2.Len() == 0 {
for this.stack1.Len() > 0 {
this.stack2.PushBack(this.stack1.Remove(this.stack1.Back()))
}
}
if this.stack2.Len() != 0 {
e := this.stack2.Back()
this.stack2.Remove(e)
return e.Value.(int)
}
return -1
}