首页 > 编程语言 >算法练习-第十一天【栈与队列】

算法练习-第十一天【栈与队列】

时间:2022-10-09 01:22:48浏览次数:105  
标签:第十一天 int 队列 queue queue1 算法 func MyStack

栈与队列

232.用栈实现队列

参考:代码随想录

思路

一道模拟题,不涉及到算法部分。如果想用栈来实现队列,至少需要2个栈,一个输入栈一个输出栈。

  1. 在进行push操作时,将数据放入到输入栈中。
  2. 在进行pop操作时,将数据从输出栈中取出,如果输出栈为空时,则将输入栈的数据全部放入输出栈。
  3. 如果输入栈和输出栈都为空,则队列为空。
type MyQueue struct {
	stackIn, stackOut []int
}

func Constructor() MyQueue {
	return MyQueue{}
}

func (q *MyQueue) Push(x int) {
	q.stackIn = append(q.stackIn, x)
}

func (q *MyQueue) in2out() {
	n := len(q.stackIn)
	for i := n - 1; i >= 0; i-- {
		q.stackOut = append(q.stackOut, q.stackIn[i])
		q.stackIn = q.stackIn[:i]
	}
}

func (q *MyQueue) Pop() int {
	if len(q.stackOut) == 0 {
		q.in2out()
	}
	x := q.stackOut[len(q.stackOut)-1]
	q.stackOut = q.stackOut[:len(q.stackOut)-1]
	return x
}

func (q *MyQueue) Peek() int {
	x := q.Pop()
	q.stackOut = append(q.stackOut, x)
	return x
}

func (q *MyQueue) Empty() bool {
	return len(q.stackIn) == 0 && len(q.stackOut) == 0
}

总结

在实际代码书写过程中,因为poppeek实现的功能类似,因为在peek方法中,可以调用pop的方法,然后将pop出来的数据再插入回输出栈。

225.用队列实现栈

参考:代码随想录

思路

使用双队列

  1. 队列queue1进行入队操作
  2. 当执行pop操作时,需要将queue1中的数据除了第0个元素外,都添加到queue2中进行备份,然后弹出queue1的第0个元素。接下来执行将queue2的队列赋值给queue1,即:queue1=queue2,清空queue2队列。
type MyStack struct {
	queue1 []int
	queue2 []int
}

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

func (s *MyStack) Push(x int) {
	s.queue1 = append(s.queue1, x)
}

func (s *MyStack) Pop() int {
	for n := len(s.queue1) - 1; n > 0; n-- {
		s.queue2 = append(s.queue2, s.queue1[0])
		s.queue1 = s.queue1[1:]
	}
	val := s.queue1[0]
	s.queue1 = s.queue1[1:]
	s.queue1, s.queue2 = s.queue2, s.queue1

	return val
}

func (s *MyStack) Top() int {
	val := s.Pop()
	s.queue1 = append(s.queue1, val)

	return val
}

func (s *MyStack) Empty() bool {
	return len(s.queue1) == 0
}

/**
 * Your MyStack object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * param_2 := obj.Pop();
 * param_3 := obj.Top();
 * param_4 := obj.Empty();
 */

优化

使用一个队列完成栈的模拟操作,当需要弹出栈顶时,将队列中的前n-1个元素全部放入到队列的尾部,那么队列出队时第1个元素就是栈顶。

type MyStack struct {
	queue []int
}

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

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

func (s *MyStack) Pop() int {
	for n := len(s.queue) - 1; n > 0; n-- {
		s.queue = append(s.queue, s.queue[0])
		s.queue = s.queue[1:]
	}
	val := s.queue[0]
	s.queue = s.queue[1:]

	return val
}

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

	return val
}

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

/**
 * Your MyStack object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * param_2 := obj.Pop();
 * param_3 := obj.Top();
 * param_4 := obj.Empty();
 */

总结

使用队列模拟栈的操作,可以利用单队列的方式完成。每次pop操作将队列头部的元素(不包括最后一个元素)放到队列的尾部重新加入队列,此时弹出的第0个元素就是栈顶的元素,然后再移除第0个元素。

标签:第十一天,int,队列,queue,queue1,算法,func,MyStack
From: https://www.cnblogs.com/neilliu/p/16770660.html

相关文章

  • 数据结构之线性表、队列、栈
    一、线性表1.两种实现方式ArrayList底层逻辑是使用数组进行实现的,不支持线程同步,非线程安全LinkedList底层逻辑是使用List实现的,不支持线程同步,非线程安全2.比较A......
  • LeetCode 字符串相乘算法题解 All In One
    LeetCode字符串相乘算法题解AllInOnejs/ts实现字符串相乘jsbignumbermultiply/js大数相乘字符串相乘原理&图解LeetCode43.MultiplyStringsLee......
  • LeetCode算法笔记 53. 最大子数组和
    给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2......
  • LeetCode算法笔记 217. 存在重复元素
    给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=......
  • 20 -- 排序算法之基数排序
        举例说明:1、第一轮:按照每个元素的 个 位取出,然后将这个数放在对应的桶(数组)中;在按照这个桶的顺序,放入原来的数组中-->  2、第二轮:按照每个元素的十 ......
  • 03 栈与递归 | 数据结构与算法
    1.栈栈的定义:限定在表尾进行插入和删除操作的线性表空栈:不换任何元素的栈栈顶top:允许插入删除的一端栈的操作(连续设计)置空栈make_null_stack()#definemaxn......
  • SPFA算法思想简述
    首先定义数组\(d_i\)表示起点到\(i\)的距离(除起点外初始化为最大值),并维护一个队列。初始将起点入队,然后每一次取队头\(x\)并且松弛所有与\(x\)相连的边,同时如果能......
  • 最简单的算法- 二分查找
    java代码/***Createdbyfupengon2017/1/11.*/publicclassbinarySearchpublicstaticlongbinarySearch_a(long[]src,intkey){intlo=0;......
  • 小学二年级都能看懂的 KMP算法详解
    介绍先上一道模板题:P3375【模板】KMP字符串匹配(难以想象这只是一道黄题)(而manacher竟然是蓝题)大意就是给你两个字符串,问其中一个在另一个里面出现过几次。至于border什......
  • 牛客网高频算法题系列-BM17-二分查找-I
    牛客网高频算法题系列-BM17-二分查找-I题目描述请实现无重复数字的升序数组的二分查找给定一个元素升序的、无重复数字的整型数组nums和一个目标值target,写一个函......