文章目录
1 栈的一个实际需求2 栈的介绍3 栈的应用场景4 栈的快速入门
1 栈的一个实际需求
请输入一个表达式 计算式:[722-5+1-5+3-3]点击计算【如下图】 请问:计算机底层是如何运算得到结果的?注意不是简单的把算式列出运算,因为我们看这个算式722-5,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。->栈
2 栈的介绍
栈的英文为(stack)。栈是一个先入后出(FILO-FirstInLastOut)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。图解方式说明出栈(pop)和入栈(push)的概念。
3 栈的应用场景
子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。二叉树的遍历。图形的深度优先(depth一first)搜索法。
4 栈的快速入门
用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来储存栈的数据内容,下面我们就用数组模拟栈的出栈,入栈等操作。实现思路分析,并画出示意图 代码实现
package com
.sukang
.stack
;
import java
.util
.Scanner
;
public class ArrayStackDemo {
public static void main(String
[] args
) {
ArrayStack arrayStack
= new ArrayStack(5);
String key
= "";
boolean loop
= true;
Scanner scanner
= new Scanner(System
.in
);
while (loop
){
System
.out
.println("show: 显示栈列表");
System
.out
.println("push: 入栈");
System
.out
.println("pop: 出栈");
System
.out
.println("exit: 退出");
System
.out
.println("请输入你的选择:");
key
= scanner
.next();
switch (key
){
case "show":
arrayStack
.list();
break;
case "push":
System
.out
.println("请输入一个需要入栈的数:");
int nub
= scanner
.nextInt();
arrayStack
.push(nub
);
break;
case "pop":
try {
int num
= arrayStack
.pop();
System
.out
.printf("出栈的数为:%d\n",num
);
} catch ( Exception e
) {
e
.printStackTrace();
}
break;
case "exit":
loop
= false;
scanner
.close();
break;
default:
break;
}
}
System
.out
.printf("退出程序~~");
}
}
class ArrayStack{
private int maxNub
;
private int[] stack
;
private int top
= -1;
public ArrayStack(int maxNub
) {
this.maxNub
= maxNub
;
stack
= new int[maxNub
];
}
public boolean isFull(){
return top
== maxNub
- 1;
}
public boolean isEmpty(){
return top
== -1;
}
public void push(int num
){
if(isFull()){
System
.out
.println("栈已经满了,不能再添加");
return;
}
top
++;
stack
[top
] = num
;
}
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈已空,没法取数据");
}
int temp
= stack
[top
];
top
--;
return temp
;
}
public void list(){
if(isEmpty()){
System
.out
.println("空栈!");
return;
}
int temp
= top
;
while (true){
if(temp
== -1){
System
.out
.println("栈已经遍历完了");
break;
}
System
.out
.printf("遍历数为%d\n",temp
+1, stack
[temp
]);
temp
--;
}
}
}
链表来模拟栈代码
package com
.sukang
.stack
;
import java
.util
.Scanner
;
import java
.util
.Stack
;
public class LinkedStackDemo {
public static void main(String
[] args
) {
LinkedStack linkedStack
= new LinkedStack();
String key
= "";
boolean loop
= true;
Scanner scanner
= new Scanner(System
.in
);
while (loop
){
System
.out
.println("show: 显示栈列表");
System
.out
.println("push: 入栈");
System
.out
.println("pop: 出栈");
System
.out
.println("exit: 退出");
System
.out
.println("请输入你的选择:");
key
= scanner
.next();
switch (key
){
case "show":
linkedStack
.list();
break;
case "push":
System
.out
.println("请输入一个需要入栈的数:");
int nub
= scanner
.nextInt();
Node node
= new Node(nub
);
linkedStack
.push(node
);
break;
case "pop":
try {
Node node1
= linkedStack
.pop();
System
.out
.println("出栈为:"+node1
);
} catch ( Exception e
) {
e
.printStackTrace();
}
break;
case "exit":
loop
= false;
scanner
.close();
break;
default:
break;
}
}
System
.out
.printf("退出程序~~");
}
}
class LinkedStack{
private Node head
= new Node(0);
public void push(Node node
){
Node temp
= head
;
while (true){
if(temp
.next
== null
){
break;
}
temp
= temp
.next
;
}
temp
.next
= node
;
}
public Node
pop(){
if(head
.next
== null
){
throw new RuntimeException("链表为空!");
}
Node temp
= head
;
while (true){
if(temp
.next
.next
== null
){
break;
}
temp
= temp
.next
;
}
Node temp1
= temp
.next
;
temp
.next
= temp
.next
.next
;
return temp1
;
}
public void list(){
if(head
.next
== null
){
System
.out
.println("空栈!");
return;
}
Stack
<Node> stack
= new Stack<>();
Node temp
= head
;
while (true){
if(temp
.next
== null
){
break;
}
stack
.add(temp
.next
);
temp
= temp
.next
;
}
while (true){
if(stack
.size() <= 0){
break;
}
System
.out
.println(stack
.pop());
}
}
}
class Node{
public int data
;
public Node next
;
public Node(int data
){
this.data
= data
;
}
@Override
public String
toString() {
return "Node["+data
+"]";
}
}