队列,是一种先进先出的数据结构,也有一些操作,我们也可以用其他的方法,来表示出那些操作。这些操作包括入队、出队、取队顶元素、判断是否为空等的操作。
下面来看看队列的一些实现方法:
一、利用链表的结构实现
首先,我们需要定义链表的节点类,再来实现队列操作的一些方法。
对于入队操作,是对链表进行尾插的操作。
对于出队操作,是将队头元素删除。
对于取队头元素的操作中,只要将front的值取出即可。
对于判断队列是否为空的在操作中,只要判断队列的长度是否为0或对头结点为空。
class Node {
int value;
Node next;
}
public class Queue {
Node front; //队头
Node rear; //队尾
int size; //队列长度
public Queue() {
front = rear = null;
size = 0;
}
//入队
public void offer(int val) {
Node node = new Node();
node.value = val;
node.next = null;
if (front == null) {
front = rear = node;
} else {
rear.next = node;
rear = rear.next;
}
size++;
}
//出队
public void poll() {
if (front == null) {
return;
}
front = front.next;
if (front == null) {
rear = null;
}
size--;
}
//取队顶元素
public int peek() {
if (front == null) {
return -1;
}
return front.value;
}
//队列长度
public int size() {
return size;
//return front == null;
}
//判断是否为空
public boolean isEmpty() {
return size == 0;
}
}
二、利用栈实现
对于队列来说,也是可以利用栈来实现队列的操作,我们知道栈这种数据结构是有先进后出的特点,所以在用栈实现队列的过程中,需要用到两个栈来完成。A、B表示两个栈(与代码中pushSt、popSt意思相同)
对于入队的操作,就直接对A栈进行入栈的操作即可。
对于出队的操作,要先将A栈中的元素进行出栈操作,将出栈元素保存在B栈中(出A栈元素入B栈),将A栈中的队头元素出队,再将保存在B栈中元素入A栈,就可以实现。
对于取队头元素,是将上述出队操作中的删除,改为对栈B执行,取栈顶的操作。
对于判断队列是否为空的操作,要满足用到的两个栈都为空即为队列为空。
import java.util.Stack;
public class MyQueue {
Stack<Integer> pushSt;
Stack<Integer> popSt;
//两个栈,来实现队列
public MyQueue() {
pushSt = new Stack<>();
popSt = new Stack<>();
}
//入队
public void push(int val) {
pushSt.push(val);
}
//出队
public int pop() {
if (popSt.isEmpty()) {
for (int i = 0;i < pushSt.size();i++) {
popSt.push(pushSt.pop());
}
}
return popSt.pop();
}
//取栈顶元素
public int peek() {
if (popSt.isEmpty()) {
for (int i = 0;i < pushSt.size();i++) {
popSt.push(pushSt.pop());
}
}
return popSt.peek();
}
//判断是否为空
public boolean empty() {
return pushSt.isEmpty() && popSt.isEmpty();
}
}
以上就是两种对队列操作的实现。