棧
一:棧的介紹
- 棧的英文名爲:stack
- 棧是一個先入後出的有序列表
- 棧是限制性表,表中的元素只能夠在線性表的一端進行插入,獲取元素,這一端爲允許變化的一端,成爲棧頂(Top),另一端則稱爲棧底。
- 根據棧的定義可以知道,最先放入棧中的數據是在棧的最底層,最後放的元素則是在棧頂,因此每次對元素進行操作,只能從棧頂開始,刪除,獲取等操作,棧不支持隨機訪問。
- 將數據放到棧中叫做壓棧(push),將元素從棧中取出稱爲將元素從棧中彈出(pop)
使用數據實現棧:
package cn.littleworm.Array.pojo;
/*
創建一個棧的思路(使用數組實現)
1、定義一個棧頂指針,初始化爲-1
2、將數據壓入棧pop
3、將數據彈出棧
4、顯示棧中的數據
5、判斷棧是否爲空或棧滿
*/
public class ArrayStarck {
//定義全局屬性:棧頂指針
private int top = -1;
private int maxsize;
private int[] stack;
//創建構造器
public ArrayStarck(int maxsize){ //maxsize是數組的長度
this.maxsize = maxsize;
//創建數組
stack = new int[this.maxsize];
}
//判斷棧是否爲空
public boolean isEmpty(){
return top == -1;
}
//判斷棧是否已滿
public boolean isFull(){
return top == maxsize-1;
}
//壓棧
public void push(int value){
//判斷是否已滿
if (isFull()){
System.out.println("棧已滿");
return;
}
top++;
stack[top] = value;
}
//彈棧
public int pop(){
//判讀是否爲空
if (isEmpty()){
//拋出異常
System.out.println("棧爲空,請先輸入數據");
return 0;
}
//用來接收數據
int value;
value = stack[top];
//將top減一
top--;
return value;
}
//顯示棧中數據
public void showList(){
//判斷棧中是否有數據
if (isEmpty()){
System.out.println("棧爲空,請先輸入數據");
return;
}
//循環遍歷
for (int i=top;i>=0;i--){
System.out.println(stack[i]);
}
}
}
測試
package cn.littleworm.Array.pojo;
import java.util.Scanner;
public class ArrayStrackDemo {
public static void main(String[] args) {
ArrayStarck arrayStarck = new ArrayStarck(4);
String key ;
boolean flag = true;
Scanner scanner = new Scanner(System.in);
while (flag){
System.out.println("show:表示顯示棧中數據");
System.out.println("pop:表示向棧中添加數據");
System.out.println("pulsh:表示從棧中彈出一個數據");
System.out.println("exit:退出程序");
System.out.print("請輸入你的選擇:");
key = scanner.next();
switch (key){
case "show":
arrayStarck.showList();
break;
case "pop":
int pop = arrayStarck.pop();
System.out.println("彈出數據是:"+pop);
break;
case "pulsh":
System.out.println("請輸入數據:");
int i = scanner.nextInt();
arrayStarck.push(i);
break;
case "exit":
scanner.close();
flag = false;
}
}
}
}
使用單鏈表實現棧
package cn.littleworm.list.pojo;
public class Node {
private int data;
public Node next;
//構造器
public Node(int data){
this.data = data;
}
//空參構造
public Node(){}
//toString方法
@Override
public String toString() {
return
"data=" + data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
}
package cn.littleworm.list.pojo;
public class ListStrack {
/*
思路:
1、每次添加就按照倒序進行插入
2、進行刪除,刪除head後面的結點
3、展示,遍歷倒序後的鏈表
*/
private Node head = new Node(0);
//插入
public void push(int data){
//創建一個結點
Node newNode = new Node(data);
if (head.next == null){
head.next = newNode;
}else {
newNode.next = head.next;
head.next = newNode;
}
}
//刪除
public void pop() {
//判斷
if (head.next == null) {
System.out.println("棧爲空,請先輸入數據");
return;
}
head.next = head.next.next;
}
//展示
public void showList(){
//判讀
if (head.next == null){
System.out.println("棧爲空,請先輸入數據");
return;
}
//定義一個輔助指針
Node f = head.next;
while (true){
System.out.println(f.getData());
if (f.next==null){
break;
}
f = f.next;
}
}
}
package cn.littleworm.list.pojo;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
ListStrack listStrack = new ListStrack();
boolean flag = true;
String key;
Scanner scanner = new Scanner(System.in);
while (flag){
System.out.println("push:向棧中壓數據");
System.out.println("pop:將棧中的數據彈出");
System.out.println("show:顯示棧中的數據");
System.out.println("exit:退出程序");
System.out.println("請選項:");
key = scanner.next();
switch (key){
case "push":
System.out.println("請輸入要壓如的數據:");
int data = scanner.nextInt();
listStrack.push(data);
break;
case "pop":listStrack.pop();break;
case "show":listStrack.showList();break;
case "exit":scanner.close();flag = false;
}
}
}
}