目录
【栈】
栈(stack),先入后出的有序列表,变化的一段称为栈顶(top),固定的一段称为栈底(bottom),入栈(push),出栈(pop)
应用场景:
1,子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
2,处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
3,表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
4,二叉树的遍历。
5,图形的深度优先(depth一first)搜索法。
数组模拟栈
简介:栈的储存依靠数组
结构分析:
要有一个top索引保存数组的最后一位索引,初始化为-1;每入栈一个top++,每出栈一个top--;
package cn.dataStructure.demo;
import java.util.Scanner;
class ArrayStack{
private int maxSize;//栈的大小
private int top=-1;//栈顶标识,初始化-1
private int stack[];//数组模拟栈
//构造器
public ArrayStack(int maxSize){
this.maxSize=maxSize;
stack=new int[maxSize];
}
//栈满
public boolean isFull(){
return top==maxSize-1;
}
//栈空
public boolean isEmpty(){
return top==-1;
}
//入栈
public void push(int value){
if (isFull()){
System.out.println("栈满");
return;
}
top++;
stack[top]=value;
}
//出栈
public int pop(){
if (isEmpty()){
throw new RuntimeException("栈空");
}
return stack[top--];
}
//打印
public void show(){
if (isEmpty()){
System.out.println("栈空");
}
for (int i=top;i>=0;i--){
System.out.println("["+i+"]"+stack[i]);
}
}
}
public class 数组模拟栈_stack {
public static void main(String[] args) {
ArrayStack stack=new ArrayStack(5);
char key=' ';//用户输入
boolean flag=true;//循环判据
Scanner scanner=new Scanner(System.in);
while (flag){
System.out.println("s(show):打印栈");
System.out.println("p(push):压栈");
System.out.println("g(pop):出栈");
System.out.println("e(exit):退出程序");
key=scanner.next().charAt(0);
switch (key){
case 's':
stack.show();
break;
case 'p':
System.out.print("请输入数据:");
stack.push(scanner.nextInt());
break;
case 'g':
try {
System.out.println(stack.pop());
}catch (Exception e){
e.getMessage();
}
break;
case 'e':
flag=false;
break;
}
}
scanner.close();
}
}
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:1
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:2
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:3
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
sw
[2]3
[1]2
[0]1
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
e
链表模拟栈
简介:链表为储存结构,可以无限添加,不用事先指定栈大小;为了逆向打印方便,使用双向链表
结构分析:
掏空数组模拟栈中的数组储存结构,改换上面讲过的双向链表即可,注意打印是按逆向打印
package cn.dataStructure.demo;
import java.util.Scanner;
class DoubleNode{
public int data;
public DoubleNode next;//保存下一个结点
public DoubleNode pre;//保存上一个结点
public DoubleNode(int data){
this.data =data;
}
@Override
public String toString() {
return "["+this.data +"]";
}
}
class DoubleLinkedListStack{
private DoubleNode root=new DoubleNode(0);//创建根节点
public DoubleNode getRoot(){
return this.root;
}
public void push(int data){//普通add:不按序号存储
DoubleNode temp=this.root;//root不能动,需要辅助结点
while (true){//查找链表最后结点
if (temp.next==null){
break;
}
temp=temp.next;//向后一位
}
DoubleNode newNode=new DoubleNode(data);
temp.next=newNode;//尾结点双向添加
newNode.pre=temp;
}
public void pop(){
if (root.next==null){//判断是否为空链表
System.out.println("空栈");
return;
}
DoubleNode temp=root;
while (temp.next!=null){//遍历到链表最后
temp=temp.next;
}
System.out.println(temp);
temp.pre.next=null;//自我删除
}
public void show(){//逆向打印
if (root.next==null){//判断是否为空链表
System.out.println("空栈");
return;
}
DoubleNode temp=root;
while (temp.next!=null){//遍历到链表最后
temp=temp.next;
}
while (temp!=root){//逆向打印
System.out.println(temp);
temp=temp.pre;
}
}
}
public class 链表模拟栈_stack {
public static void main(String[] args) {
DoubleLinkedListStack stack=new DoubleLinkedListStack();
char key=' ';//用户输入
boolean flag=true;//循环判据
Scanner scanner=new Scanner(System.in);
while (flag){
System.out.println("s(show):打印栈");
System.out.println("p(push):压栈");
System.out.println("g(pop):出栈");
System.out.println("e(exit):退出程序");
key=scanner.next().charAt(0);
switch (key){
case 's':
stack.show();
break;
case 'p':
System.out.print("请输入数据:");
stack.push(scanner.nextInt());
break;
case 'g':
stack.pop();
break;
case 'e':
flag=false;
break;
}
}
scanner.close();
}
}
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
s
空栈
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:1
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:2
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:3
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:4
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:5
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
p
请输入数据:6
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
s
[6]
[5]
[4]
[3]
[2]
[1]
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
g
[6]
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
s
[5]
[4]
[3]
[2]
[1]
s(show):打印栈
p(push):压栈
g(pop):出栈
e(exit):退出程序
e
栈的应用--逆波兰计算器实现
这部分内容复杂,我整理在了【栈结构应用_普通计算器和逆波兰计算器】中
【数据结构与算法整理总结目录 :>】<-- 宝藏在此(doge)