學到LinkedList,上課時老師提了一下代碼實現棧和隊列,面試可能會用上,就碼了棧和隊列兩種實現方案。如有問題,希望指出。
一、棧
1.數組實現棧
/*
利用數組的方式實現一個棧
棧的特點: 存儲數據 -- 先進後出(就像彈夾)
定義一個棧類:
成員變量:
1.存儲數據的數組
2.棧容量
3.棧頂索引
成員方法:
1.壓入數據方法
2.取出數據方法
*/
public class Stack {
private int[] data;
private int size;
private int stackTop = -1; //記錄棧頂索引, 默認空, 索引-1
//構造方法
public Stack(int size) {
this.size = size;
this.data = new int[size];
}
public boolean push(int data) { //壓棧方法
if (stackTop + 1 == size) {
System.out.println("棧已滿");
return false;
}
this.data[++stackTop] = data; //棧頂默認值爲-1,所以要先加後充當索引
return true;
}
public int pop() throws Exception { //出棧方法
if (stackTop == -1) {
throw new Exception("棧已空");
}
return data[stackTop--]; //返回數據後棧頂後移
}
}
class StackDemo {
public static void main(String[] args) throws Exception {
Stack s = new Stack(5);
//s.pop(); //報棧空
//壓棧
for (int i = 1; i <= 5; i++) {
System.out.println(s.push(i));
}
//s.push(6); //報棧滿
//出棧
for (int i = 0; i < 5; i++) {
System.out.println(s.pop());
}
}
}
2.LinkedList實現棧
import java.util.LinkedList;
/*
使用 LinkedList類 實現棧
LinkedList類: 底層是鏈表 特點: 查詢慢, 增刪快
特有功能:
public void addFirst(E e): 在該列表開頭插入指定元素
public void addLast(E e): 將指定元素追加到此列表的末尾
public E getFirst(): 返回此列表中的第一個元素
public E getLast(): 返回此列表中的最後一個元素
public E removeFirst(): 從此列表中刪除並返回第一個元素
public E removeLast(): 從此列表中刪除並返回最後一個元素
*/
public class Stack {
private LinkedList<Integer> list = new LinkedList<>();
private int size; //棧的大小
//構造方法
public Stack(int size) {
this.size = size;
}
//壓棧方法
public boolean push(int data) {
if (list.size() == size) {
System.out.println("棧已滿");
return false;
}
list.addLast(data); //直接使用LinkedList的方法往後添加元素
return true;
}
//出棧方法
public int pop() throws Exception {
if (list.size() == 0) {
throw new Exception("棧已空");
}
return list.removeLast(); //刪除並返回最後一個元素
}
}
class StackDemo {
public static void main(String[] args) throws Exception {
Stack s = new Stack(5);
//s.pop(); //報棧空
//壓棧
for (int i = 1; i <= 5; i++) {
s.push(i);
}
//s.push(6); //報棧滿
//出棧
for (int i = 0; i < 5; i++) {
System.out.println(s.pop());
}
//s.pop(); //報棧空
}
}
二、隊列
1.數組實現隊列
/*
數組實現隊列
隊列的特點: 存儲數據 -- 先進先出(排隊)
定義一個隊列類:
成員變量:
1.存儲數據的數組
2.隊列容量
3.隊列頭部索引
4.隊列尾部索引
成員方法:
1.加入數據方法
2.取出數據方法
*/
public class Queue {
private int[] data;
private int size;
private int queueLast = -1; //隊列頭索引
private int queueFirst = -1; //隊列尾索引
//構造方法
public Queue(int size) {
this.size = size;
this.data = new int[size];
}
//入列
public boolean inQueue(int data) {
if (queueLast + 1 == size) {
System.out.println("隊列已滿");
return false;
}
this.data[++queueLast] = data;
return true;
}
//出列
public int outQueue() throws Exception {
if (queueFirst == queueLast) {
throw new Exception("隊列已空");
}
return data[++queueFirst];
}
}
class QueueDemo {
public static void main(String[] args) throws Exception {
Queue q = new Queue(5);
//q.outQueue(); //報隊列空
for (int i = 1; i <= 5; i++) {
q.inQueue(i);
}
//q.inQueue(6); //報隊列滿
for (int i = 0; i < 5; i++) {
System.out.println(q.outQueue());
}
//q.outQueue(); //報隊列空
}
}
2.LinkedList實現隊列
import java.util.LinkedList;
/*
LinkedList實現隊列
*/
public class Queue {
private LinkedList<Integer> list = new LinkedList<>();
private int size;
//構造方法
public Queue(int size) {
this.size = size;
}
//入隊列方法
public boolean inQueue(int data) {
if (list.size() == size) {
System.out.println("隊列已滿");
return false;
}
list.addLast(data); //從頭添加元素
return true;
}
//出隊列方法
public int outQueue() throws Exception {
if (list.size() == 0) {
throw new Exception("隊列已空");
}
return list.removeFirst(); //從頭刪除元素並返回元素
}
}
class QueueDemo {
public static void main(String[] args) throws Exception {
Queue q = new Queue(5);
//q.outQueue(); //報隊列空
for (int i = 1; i <= 5; i++) {
q.inQueue(i);
}
//q.inQueue(6); //報隊列滿
for (int i = 0; i < 5; i++) {
System.out.println(q.outQueue());
}
//q.outQueue(); //報隊列空
}
}