栈与队的相互转换

import java.util.LinkedList;
import java.util.Stack;

/**
* 1、利用两个栈实现一个队列 思路:插入的时候直接插入第一个栈 移除的时候,如果第二个栈为空,则把第一个站所有元素放入第二个站 从第二个站移除一个元素即可
* 2、两个队列实现一个栈 思路:插入的时候,如果两个队列都为空则插入任意一个队列,否则插入非空的那个队列
*    移除的时候,把非空队列的元素全部弄到空队列里,把最后一个元素返回
* 3、利用一个队列实现一个栈 思路:利用递归的方式把队列反转,返回第一个
* 4、利用一个栈实现一个队列 思路: 利用递归的方式把数据都推出来,返回最后一个
* 5、实现栈取和进最小数都是O(1)
*    思路:在插入数据的时候同时把当前最小的数也插入到栈中,从而在取的时候就娶到最小数, 同时在取的时候把该数和最小数都一起弹出
*
* @author wangjianfu
*
*/
public class TestStack1 {
public static void main(String[] args) {
MiniStack q = new MiniStack(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);

System.out.println("当前最小值:" + q.getMinNumber());

System.out.println("拿出值:" + q.pop());

System.out.println("当前最小值:" + q.getMinNumber());

System.out.println("拿出值:" + q.pop());

System.out.println("当前最小值:" + q.getMinNumber());

System.out.println("拿出值:" + q.pop());

System.out.println("当前最小值:" + q.getMinNumber());

System.out.println("拿出值:" + q.pop());
}
}

class MiniStack {
private Integer minnumber = 10000;
private int top = -1;
private Integer[] numbers;
private int length = 0;
private int maxlen;

public MiniStack(int length) {
numbers = new Integer[length];
maxlen = length/2;
}

// 插入数据
public void push(int n) {
if (length + 2 > maxlen - 1) {
System.out.println("栈 已经满了");
return;
}
minnumber = n > minnumber ? minnumber : n;
top++;
numbers[top] = n;
top++;
length++;
numbers[top] = minnumber;
}

public Integer pop() {
if (length == 0) {
System.out.println("栈为空");
return null;
}
top--;// 跳过最小的数
int result = numbers[top];
top--;
length--;
return result;
}

public Integer getMinNumber() {
if (length == 0) {
System.out.println("栈为空");
return null;
}
return numbers[top];
}

}

class Queue {
private Stack<Integer> s1 = new Stack<Integer>();
private Stack<Integer> s2 = new Stack<Integer>();

public void insert(Integer temp) {
s1.push(temp);
}

public Integer remove() {
if (s2.size() == 0) {
// 把s1元素全部弹出放入s2
while (s1.size() > 0) {
s2.push(s1.pop());
}
}
// 从s2中直接弹出一个元素
return s2.pop();
}
}

class Queue2 {
private Stack<Integer> s1 = new Stack<Integer>();

public void insert(Integer temp) {
s1.push(temp);
}

public Integer remove() {
if (s1.size() == 0) {
return null;
}
if (s1.size() == 1) {
return s1.pop();
}
int temp = s1.pop();
int result = remove();
s1.push(temp);
return result;

}
}

class Stackk {
private java.util.LinkedList<Integer> q1 = new LinkedList<Integer>();
private java.util.LinkedList<Integer> q2 = new LinkedList<Integer>();

public void insert(Integer temp) {
if (q1.size() == 0 && q2.size() == 0) {
q1.add(temp);
} else if (q1.size() > 0) {
q1.add(temp);
} else {
q2.add(temp);
}
}

public Integer remove() {
if (q1.size() > 0) {
while (q1.size() > 0) {
q2.add(q1.poll());
}
return q2.poll();
} else if (q2.size() > 0) {
while (q2.size() > 0) {
q1.add(q2.poll());
}
return q1.poll();
} else {
return null;
}
}
}

class Stackk2 {
private java.util.LinkedList<Integer> q2 = new LinkedList<Integer>();

public void insert(Integer temp) {
q2.add(temp);
}

public Integer remove() {
if (q2.size() == 0) {
return null;
}
reverse();
int result = q2.poll();
reverse();
return result;
}

public void reverse() {
if (q2.size() == 0) {
return;
}
int temp = q2.poll();
reverse();
q2.add(temp);
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值