想要解决这两个问题,首先先简单复习一下栈和队列
栈
栈(Stack)是一种线性数据结构,其特点是数据的添加、删除,是“先进后出”的原则,也就是说,想要弹出一个元素,那么这个元素肯定是最后添加进来的,而第一个添加进去的元素 ,就最后等其他元素被移出才能出栈。
栈的基本操作如下:
- 入栈(Push):将一个元素添加到栈顶。
- 出栈(Pop):移除栈顶的元素,并返回该元素的值。
- 查看栈顶元素(Peek ):返回栈顶元素的值,但不移除它。
- 判断栈是否为空(Is Empty):检查栈中是否没有元素。
这里用数组简单实现一下栈的基本功能
import java.util.EmptyStackException;
public class Stack {
private int maxSize;
private int top;
private int[] stackArray;
public Stack(int size) {
maxSize = size;
stackArray = new int[maxSize];
top = -1; // 表示栈为空
}
public void push(int value) {
if (!isFull()) {
top++;
stackArray[top] = value;
} else {
System.out.println("栈已满,无法添加元素");
}
}
public int pop() {
if (!isEmpty()) {
return stackArray[top--];
} else {
throw new EmptyStackException();
}
}
public int peek() {
if (!isEmpty()) {
return stackArray[top];
} else {
throw new EmptyStackException();
}
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == maxSize - 1);
}
public static void main(String[] args) {
Stack stack = new Stack(5); // 创建一个容量为5的栈
stack.push(10); // 入栈
stack.push(20);
stack.push(30);
System.out.println("栈顶元素: " + stack.peek()); // 查看栈顶元素
System.out.println("出栈元素: " + stack.pop()); // 出栈
System.out.println("栈顶元素: " + stack.peek()); // 再次查看栈顶元素
System.out.println("栈是否为空: " + stack.isEmpty()); // 检查栈是否为空
}
}
队列
队列(Queue)相对于栈的最大区别就是,队列是先进先出的数据结构,类似于排队打饭,先到的先得
队列的基本操作如下:
- 入队(Enqueue):将一个元素添加到队尾。
- 出队(Dequeue):从队头移除一个元素,并返回该元素。如果队列为空,则无法进行出队操作。
- 查看队头元素(Peek ):返回队头元素,但不从队列中移除它。如果队列为空,则无法进行此操作。
- 判断队列是否为空(IsEmpty):检查队列中是否没有元素。
下面是用链表实现队列的功能
import java.util.LinkedList;
public class Queue<T> {
private LinkedList<T> list = new LinkedList<>();
// 入队操作
public void enqueue(T item) {
list.addLast(item);
}
// 出队操作
public T dequeue() {
if (!isEmpty()) {
return list.removeFirst();
} else {
throw new RuntimeException("Queue is empty");
}
}
// 查看队头元素
public T peek() {
if (!isEmpty()) {
return list.getFirst();
} else {
throw new RuntimeException("Queue is empty");
}
}
// 判断队列是否为空
public boolean isEmpty() {
return list.isEmpty();
}
// 获取队列的大小
public int size() {
return list.size();
}
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
// 入队操作
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
System.out.println("Queue size: " + queue.size()); // 输出队列大小
// 查看队头元素
System.out.println("Front element: " + queue.peek());
// 出队操作
System.out.println("Dequeued element: " + queue.dequeue());
// 再次查看队头元素
System.out.println("Front element after dequeue: " + queue.peek());
// 判断队列是否为空
System.out.println("Is queue empty? " + queue.isEmpty());
}
}
225. 用队列实现栈
需要注意以下几点:
- 两个普通队列才能实现栈。
- 出栈:把一个队列的所有元素-1放到另一个队列当中,当前剩的元素就是我们要出栈的元素。
- 入栈:把数据放到不为空的队列当中(注:第一次入栈都是空队列,默认放到第一个队列当中)。
以下就是队列实现栈的所有代码
import java.util.LinkedList;
import java.util.Queue;
class MyStackUsQueue {//用队列实现栈
public Queue<Integer> queue1;
public Queue<Integer> queue2;
public MyStackUsQueue() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
/**
* 入栈
* @param x
*/
public void push(int x) {
if(empty()) {
queue1.offer(x);//都是空默认第一个默认放第一个
return;
}
if(!queue1.isEmpty()) {//不是第一次入栈,那么元素存放在非空队列
queue1.offer(x);
}else {
queue2.offer(x);
}
}
/**
* 出栈
* @return
*/
public int pop() {
if(empty()) {
return -1;
}
if(!queue1.isEmpty()) {//如果第一个有元素就将第一个队列(总元素-1)都放到队列2,第一个队列最后一个元素出列
int size = queue1.size();
for (int i = 0; i < size-1; i++) {
queue2.offer(queue1.poll());
}
return queue1.poll();
}else {//第一个元素是空的,就将第二个队列(总元素-1)都放到第一个队列里,把第二个最后一个元素出队
int size = queue2.size();
for (int i = 0; i < size-1; i++) {
queue1.offer(queue2.poll());
}
return queue2.poll();
}
}
/*
获取栈顶元素
*/
public int top() {
if(empty()) {
return -1;
}
if(!queue1.isEmpty()) {
int size = queue1.size();
int ret = -1;
for (int i = 0; i < size; i++) {//用一个中间变量保存每次出队的元素,最后出完了,最后ret保存下来的就是队列最后一个元素,也就是栈顶元素
ret = queue1.poll();
queue2.offer(ret);
}
return ret;
}else {
int size = queue2.size();
int ret = -1;
for (int i = 0; i < size; i++) {
ret = queue2.poll();
queue1.offer(ret);
}
return ret;
}
}
/*
栈是否为空
*/
public boolean empty() {
return queue1.isEmpty() && queue2.isEmpty();
}
}
232. 用栈实现队列
需要注意以下几点:
- 两个栈才能模拟实现队列
- 入栈:始终将元素存放到第一个队列
- 出栈:始终从第二队列出栈,每次出栈都把第一个队列中所有元素都放到第二队列中
class MyQueue {//规定好s1只入栈,s2只出栈
Stack <Integer>stack1;
Stack <Integer>stack2;
public MyQueue() {
stack1=new Stack<>();
stack2=new Stack<>();
}
public void push(int x) {
stack1.push(x);
}
public int pop() {
if(empty()){
return -1;
}
if(!stack1.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
return stack2.pop();
}else{
return stack2.pop();
}
}
public int peek() {
if(empty()){
return -1;
}
if(!stack1.empty()){
while(!stack1.empty()){
stack2.push(stack1.pop());
}
return stack2.peek();
}else{
return stack2.peek();
}
}
public boolean empty() {
return stack1.empty()&&stack2.empty();
}
}
以上就是所有内容啦,如果有帮到你,请帮忙三连,谢谢各位