1.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
方法:1.使用两个栈 stackData,stackMin,一个记录数据,另一个栈确保栈顶是当前数据栈的最小元素
2.入栈:若stackMin空,则直接入,否则如果当前元素小于等于栈顶元素,入栈,否则,不入。
3.出栈:如果从stackData出来的元素于当前stackMin元素栈顶相同,stackMin进行一次出栈。
private Stack<Integer> stack=new Stack<>(); private Stack<Integer> min=new Stack<>(); public void push(int node) { stack.push(node); if(min.isEmpty()||node<=min.peek()) min.push(node); } public void pop() { int value=stack.pop(); if(!min.isEmpty()&&value==min.peek()) min.pop(); } public int top() { return stack.peek(); } public int min() { return min.peek(); }
2.用栈实现队列的功能
问题:用两个栈结构实现队列,支持队列的基本操作(push,pop,peek)
方法:使用一个栈压入,使用另一个栈弹出。如队列1 2 3 4 5,压入栈时依次入栈,
在栈内就是1 2 3 4 5 ,5是栈顶,将此栈元素倒入另一个栈,
在栈内就是5 4 3 2 1,1是栈顶,依次出栈就是一个队列。
要点:将元素从压入栈倒入弹出栈时,需确保弹出栈为空且压入栈已全部倒入。
3.将栈逆序,要求不能使用额数据结构,只能使用递归函数
方法:1.使用一个get函数,每次取得并移除栈底元素,其他元素顺序不变。
2.使用一个reverse函数,每一层都调用一次get,当每一层返回时,将get得到的元素入栈,最后即得到逆序栈。
public int get(Stack<Integer> stk) { int value=stk.pop(); int last=value; if(!stk.isEmpty()) { last=get(stk); stk.push(value); } return last; } public void reverse(Stack<Integer> stk) { int ele=get(stk); if(!stk.isEmpty()) reverse(stk); stk.push(ele); }
4.按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据
分析:类似于第一个带最值的栈的问题,使用一个辅助栈,
从数据栈依次弹出元素,如果不大于辅助栈栈顶,则入辅助栈,否则,依次从辅助栈弹入到数据栈,直到能够入辅助栈。
最后数据栈全部压入辅助栈,则将辅助栈全部倒入数据栈,完成排序。
原文地址:https://www.cnblogs.com/lshao/p/9028225.html
时间: 2024-10-15 19:31:56