首页 > 其他分享 >代码随想录day10 || 232 栈实现队列, 225 队列实现栈,20 删除有效括号,1047 删除字符串相邻重复项

代码随想录day10 || 232 栈实现队列, 225 队列实现栈,20 删除有效括号,1047 删除字符串相邻重复项

时间:2024-07-26 13:39:24浏览次数:15  
标签:return cur 删除 队列 随想录 func Data stack Size

232 实现队列

// go本身并不支持原生的栈和队列结构,都是通过切片实现的
//leetcode submit region begin(Prohibit modification and deletion)
type MyQueue struct {
	Data []int
	Size int
}


func Constructor() MyQueue {
	return MyQueue{}
}


func (this *MyQueue) Push(x int)  {
	this.Data = append(this.Data, x)
	this.Size++
}


func (this *MyQueue) Pop() int {
	// 弹出首位
	if this.Size == 0 {
		return 0
	}
	temp := this.Data[0]
	this.Data = this.Data[1:]
	this.Size--
	return temp
}


func (this *MyQueue) Peek() int {
	// 弹出首位
	if this.Size == 0 {
		return 0
	}
	return this.Data[0]
}


func (this *MyQueue) Empty() bool {
	return this.Size == 0
}

225 实现栈

// 尝试通过链表方式实现栈
type LinkNode struct {
	Data int
	Next *LinkNode
}

type MyStack struct {
	Data *LinkNode
	Size int
}


func Constructor() MyStack {
	return MyStack{
		Data: &LinkNode{},
		Size: 0,
	}
}


func (this *MyStack) Push(x int)  {
	node := &LinkNode{x, nil}
	cur := this.Data  // 指针类型引用可以修改原变量
	for cur != nil && cur.Next != nil {
		cur = cur.Next
	}
	cur.Next = node
	this.Size++
}


func (this *MyStack) Pop() int {
	// 栈顶就是最后的元素
	cur := this.Data
	for cur.Next != nil && cur.Next.Next != nil {
		cur = cur.Next
	}
	// 此时cur是倒数第二个位置
	num := cur.Next.Data
	cur.Next = nil
	this.Size--
	return num
}


func (this *MyStack) Top() int {
	cur := this.Data
	for cur.Next != nil {
		cur = cur.Next
	}
	return cur.Data
}


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

20 删除有效括号

// 本题目使用stack是魔改上面的栈,将数据类型转换为rune
func isValid(s string) bool {
	// 思考 栈结构,依次入栈,匹配之后出栈,如果遍历结束之后还存留元素,那么返回fasle
	// 存储映射
	var maps = map[rune]rune{
		'}': '{',
		')': '(',
		']': '[',
	}
	stack := Constructor()
	for _, val := range s { // for range 遍历字符串,val是rune = []int32 类型
		if stack.Size > 0 {
			// fmt.Println(maps[val] ,stack.Top())
			if maps[val] == stack.Top() { // 匹配
				stack.Pop()
				continue // 进入下一个循环
			}
		}
		// 栈为空,或者元素不匹配
		stack.Push(val)
	}
	return stack.Empty()
}

// 时间遍历n次*每次top操作查询n = n^2 (优化方案就是尝试将栈结构里面的节点存储为尾节点,那么每次top操作的复杂度就是1), 空间n

1047 删除重复

func removeDuplicates(s string) string {
	// 使用栈的特性进行遍历对比
	// 规则,如果栈顶元素 == 遍历元素,那么就弹出,如果不等 入栈
	var res string
	stack := Constructor()
	for _, val := range s{
		// fmt.Println(stack.Size, string(stack.Top()), string(val))
		if stack.Size>0 && stack.Top() == val {
			stack.Pop()
			continue
		}
		stack.Push(val)
	}
	// 最后将栈里面元素反序打印
	for stack.Size != 0 {
		res = string(stack.Pop()) + res
	}
	return res
}

// 实现一个存储尾节点的链表实现的栈
type LinkNode struct{
	Data rune
	Prev *LinkNode
	Next *LinkNode
}

type Stack struct {
	Node *LinkNode
	Size int
}

func Constructor() *Stack {
	return &Stack{
		Node: &LinkNode{},
		Size: 0,
	}
}

func (s *Stack) Push(x rune) {
	node := &LinkNode{x, nil, nil}
	node.Prev = s.Node
	s.Node.Next = node // 连接到链表
	s.Node = node // 指向尾节点
	s.Size++
}

func (s *Stack) Pop() rune {
	next := s.Node.Prev // 前一个节点
	data := s.Node.Data
	next.Next = nil // 将最后一个节点断开连接
	s.Node.Prev = nil // 节点完全断开,防止还有悬挂指针,导致意料之外的内存泄漏
	s.Node = next // 重新指向前一个结点
	s.Size--
	return data
}

func (s *Stack) Top() rune {
	if s.Size == 0 {
		return ' ' // 单引号里面必须有一个字符不然就是非法的
	}
	return s.Node.Data
}

func (s *Stack) Empty() bool {
	return s.Size == 0
}

// 时间 n层遍历 * top 1 = n , 空间n

标签:return,cur,删除,队列,随想录,func,Data,stack,Size
From: https://www.cnblogs.com/zhougongjin55/p/18325184

相关文章

  • Day10 栈和队列Part1
    任务232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)思路算是一个模拟类的题目,用py中,用列表加上限制条件表示栈(只能用pop表示对栈顶元素出栈处理)push:用stackIn保存入队元素pop:出队时,分三种情况,如果队列......
  • 代码随想录算法训练营第45天 | 子序列入门
    300.最长递增子序列https://leetcode.cn/problems/longest-increasing-subsequence/代码随想录https://programmercarl.com/0300.最长上升子序列.html674.最长连续递增序列https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/代码随想录......
  • 算法入门篇(四)之栈和队列
    目录一、顺序栈、链栈1、顺序栈1.定义与存储结构2.特点3.适用场景2、链栈1.定义与存储结构2.特点3.适用场景3、总结二、顺序队列、链式队列1、顺序队列1.定义与存储结构2.特点3.循环队列4.适用场景2、链式队列1.定义与存储结构2.特点3.适用......
  • 代码随想录算法训练营第44天 | 动态规划9:买卖股票总结
    188.买卖股票的最佳时机IVhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/代码随想录https://programmercarl.com/0188.买卖股票的最佳时机IV.html#算法公开课309.最佳买卖股票时机含冷冻期https://leetcode.cn/problems/best-time-to-buy-a......
  • 在Python 3中删除两个指定字符串之间的字符串
    我正在从事一个NLP项目,该项目要求我从一段文本中删除计算机代码。代码包含在标签<pre><code>和</code></pre>之间。现在我可以做一个简单的正则表达式匹配,但我想概括这个函数,以便它可以删除任何两个指定字符串之间的文本,即使它们是嵌套的。例如,如果我有一个......
  • 数据结构之队列详解
    1.队列的概念以及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFo(FristinFristout)的特性入队列:进行插入才操作的一端称为队尾出队列:进行删除操作的一端称为队头2.队列的实现队列也可以使用数组和链表的结构实现,使用......
  • 用户和用户组的删除、配置文件的格式、shell
    1.用户的删除:userdel[选项]用户名选项:-r:删除用户的同时,删除用户的家目录和邮件池中的文件。-f:强制删除用户,即使该用户当前已登录。PS:系统发现与该用户关联的邮件信箱不存在,就会显示“信件池未找到”的错误消息。这个错误消息本身并不影响用户删除的过程。即使出现了这个......
  • 电脑怎么恢复删除的文件?8个方法,简单搞定文件恢复!(强力推荐)
    电脑怎么恢复删除的文件?随着如今几乎每个人都拥有或使用计算机,文件丢失和误删已成为我们在日常计算机使用中难以避免的问题之一。在我们使用计算机的过程中,经常会遇到各种问题,有些可以轻松解决,而有些可能需要专业技术支持。您是否曾经因不慎删除个人电脑中的文件而感到困惑?这是......
  • 栈,队列,链表
     栈堆栈又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈......
  • 通过“ 栈 ”实现“ 队列 ”
                  ......