栈结构_数组模拟栈,链表模拟栈

目录

【栈】

数组模拟栈

链表模拟栈

栈的应用--逆波兰计算器实现


【栈】

栈(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)  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值