一 用两个栈实现队列
1.1 题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
1.2 思路以及代码
题目的意思
输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
1.执行CQueue的操作,生成队列,没有值传递,也不返回任何信息
2.进队列的操作:将3放入队列,没有返回值
3.删除对头元素:在这里队头元素为3,删除队头元素,并返回删除的元素值,所以返回3
4.删除对头元素:队列中不存在元素,删除失败,返回-1
5.删除对头元素:队列中不存在元素,删除失败,返回-1
思路:
进队列的操作:
直接在栈1中添加就行,例如队尾先后添加1,2,3,注意栈是上面是top(先进后出)
3 |
2 |
1 |
删除队头元素的时候的操作为,首先我们要将 上面的栈中的数据转移到栈2中。
1 |
2 |
3 |
删除栈顶的元素,我们就删除1
2 |
3 |
就通过双栈实现了队列。(添加直接在一个栈中完成,删除队头元素,需要将元素从栈1转移到栈2,删除栈2,栈顶的元素,完成删除队头的操作)
代码如下:
其中StackPractice类的代码:
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SuanfapRractice
{
public class StackPractice
{
Stack<int> inStack;
Stack<int> outStack;
public StackPractice()
{
inStack=new Stack<int>();
outStack=new Stack<int>();
}
public void AppendTail(int value)
{
inStack.Push(value);
}
public int DeleteHead()
{
if(outStack.Count == 0)
{
if(inStack.Count==0)
{
return -1;
}
while(inStack.Count> 0)
{
outStack.Push(inStack.Pop());
}
}
return outStack.Pop();
}
}
}
开始类,主函数
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System;
using System.Collections.Generic;
using System.Xml.Linq;
using SuanfapRractice;
public class Solution
{
public static void Main(String[] args)
{
StackPractice sp = new StackPractice();
Console.WriteLine(sp.DeleteHead());
sp.AppendTail(5);
sp.AppendTail(2);
Console.WriteLine(sp.DeleteHead());
Console.WriteLine(sp.DeleteHead());
}
}
结果为:
-1
5
2
1.3 c#相关知识点
1.Stack常用的方法
序号 | 方法名 & 描述 |
---|---|
1 | public virtual void Clear(); 从 Stack 中移除所有的元素。 |
2 | public virtual bool Contains( object obj ); 判断某个元素是否在 Stack 中。 |
3 | public virtual object Peek(); 返回在 Stack 的顶部的对象,但不移除它。 |
4 | public virtual object Pop(); 移除并返回在 Stack 的顶部的对象。 |
5 | public virtual void Push( object obj ); 向 Stack 的顶部添加一个对象。 |
6 | public virtual object[] ToArray(); 复制 Stack 到一个新的数组中。 |
2.C#访问修饰符
上文代码修改修饰符后也是可以执行的
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SuanfapRractice
{
internal class StackPractice
{
Stack<int> inStack;
Stack<int> outStack;
public StackPractice()
{
inStack=new Stack<int>();
outStack=new Stack<int>();
}
internal void AppendTail(int value)
{
inStack.Push(value);
}
internal int DeleteHead()
{
if(outStack.Count == 0)
{
if(inStack.Count==0)
{
return -1;
}
while(inStack.Count> 0)
{
outStack.Push(inStack.Pop());
}
}
return outStack.Pop();
}
}
}
二 包含min函数的栈
2.1 题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof
1.2 思路以及代码
此思路具体可以查看官方 解题的讲解
代码
MinStack类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SuanfapRractice
{
public class MinStack
{
Stack<int> inStack;
Stack<int> minStack;
public MinStack()
{
inStack = new Stack<int>();
minStack = new Stack<int>();
}
public void Push(int x)
{
inStack.Push(x);
if(minStack.Count == 0||minStack.Peek() > x )
{
minStack.Push(x);
}
else
{
minStack.Push(minStack.Peek());
}
}
public void Pop()
{
inStack.Pop();
minStack.Pop();
}
public int Top()
{
return inStack.Peek();
}
public int Min()
{
return minStack.Peek();
}
}
}
包含Main方法的类
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System;
using System.Collections.Generic;
using System.Xml.Linq;
using SuanfapRractice;
public class Solution
{
public static void Main(String[] args)
{
MinStack minStack = new MinStack();
minStack.Push(-2);
minStack.Push(0);
minStack.Push(-3);
Console.WriteLine(minStack.Min());
minStack.Pop();
Console.WriteLine(minStack.Top());
Console.WriteLine(minStack.Min());
Console.WriteLine("----------------");
MinStack minStack1 = new MinStack();
minStack1.Push(2);
minStack1.Push(0);
minStack1.Push(3);
minStack1.Push(0);
Console.WriteLine(minStack1.Min());
minStack1.Pop();
Console.WriteLine(minStack1.Min());
minStack1.Pop();
Console.WriteLine(minStack1.Min());
minStack1.Pop();
Console.WriteLine(minStack1.Min());
}
}
结果为:
-3
0
-2
----------------
0
0
0
2