数据结构之堆栈的链式存储(Java表示)

目录

堆栈的链式存储

一些基本概念

堆栈的链式存储实现

堆栈应用

Java代码实现


堆栈的链式存储

一些基本概念

栈的链式存储结构实际上就是一个单链表,叫做链栈。

插入和删除操作只能在链顶进行。

链顶指针Top在链表的头部。

堆栈的链式存储实现

堆栈应用

  • 表达式求值
  • 函数调用及递归实现
  • 深度优先搜索
  • 回溯算法

Java代码实现

Node类如下:

public class Node {
    private Object data;
    private Node next;

    public Node(){
        super();
    }

    public Node(Object data,Node next){
        super();
        this.data=data;
        this.next=next;
    }

    public Node(Object data){
        super();
        this.data=data;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}
/**
 * 堆栈的链式存储
 *
 * @author lck100
 */
public class MyStack {
    private Node head;// 栈

    private MyStack() {
        // 构建头节点
        head = new Node();
        head.setNext(null);
    }

    /**
     * 判断堆栈是否为空
     *
     * @return 如果为空则返回true,否则返回false
     */
    public boolean isEmpty() {
        return head.getNext() == null;
    }

    /**
     * 入栈,将元素压入栈中
     *
     * @param item 要压入栈中的元素
     */
    public void push(Object item) {
        // 由于是链式存储,所以不存在满栈的情况
        // 创建一个新的结点
        Node node = new Node();
        // 为结点赋值
        node.setData(item);
        // 指向当前堆栈的栈顶结点
        node.setNext(head.getNext());
        // 将当前堆栈的下一个元素(栈顶)指向新结点
        head.setNext(node);
    }

    /**
     * 删除并返回堆栈的栈顶元素
     *
     * @return 返回堆栈的栈顶元素
     * @throws Exception 抛出异常
     */
    public Object pop() throws Exception {
        // 判断是否栈为空
        if (isEmpty()) {
            throw new Exception("栈为空,无元素可删除!");
        } else {
            // 获取当前栈顶结点
            Node topNode = head.getNext();
            // 将栈顶结点指向当前栈顶元素
            head.setNext(topNode.getNext());
            // 获取栈顶元素的数据
            return topNode.getData();
        }
    }

    public static void main(String[] args) throws Exception {
        MyStack stack = new MyStack();
        // 判断当前栈是否为空
        System.out.println(stack.isEmpty() + "\n");

        // 入栈
        stack.push("唐僧");
        stack.push("孙悟空");
        stack.push("猪八戒");
        stack.push("沙僧");
        stack.push("小白龙");

        // 出栈
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
    }
}

测试,控制台打印:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
堆栈是一种先进后出(Last-In-First-Out,LIFO)的数据结构链式存储堆栈的一种实现方式。链式存储堆栈不需要预先指定堆栈的长度,可以动态地分配内存,具有灵活性和可扩展性。 链式存储堆栈可以使用单向链表或双向链表来实现。以单向链表为例,堆栈的顶端称为栈顶,堆栈的底部称为栈底。 堆栈的基本操作包括入栈(Push)、出栈(Pop)、获取栈顶元素(Top)和判断堆栈是否为空(IsEmpty)。 下面是堆栈链式存储的实现代码: ```C++ #include <iostream> using namespace std; // 定义堆栈的结点结构体 struct StackNode { int data; // 数据域 StackNode *next; // 指针域,指向下一个结点 }; // 定义堆栈类 class Stack { private: StackNode *top; // 栈顶指针 public: Stack() { top = NULL; } // 构造函数,初始化栈顶指针为空 ~Stack(); // 析构函数,释放内存 bool IsEmpty(); // 判断堆栈是否为空 void Push(int x); // 入栈 int Pop(); // 出栈 int Top(); // 获取栈顶元素 }; // 判断堆栈是否为空 bool Stack::IsEmpty() { return top == NULL; } // 入栈 void Stack::Push(int x) { StackNode *newNode = new StackNode; // 创建新结点 newNode->data = x; // 设置数据域 newNode->next = top; // 将新结点插入到栈顶 top = newNode; // 更新栈顶指针 } // 出栈 int Stack::Pop() { if (IsEmpty()) { // 判断是否为空栈 cout << "Error: Stack is empty!" << endl; return -1; } else { StackNode *temp = top; // 保存栈顶结点 int x = temp->data; // 获取栈顶元素 top = top->next; // 更新栈顶指针 delete temp; // 释放内存 return x; } } // 获取栈顶元素 int Stack::Top() { if (IsEmpty()) { // 判断是否为空栈 cout << "Error: Stack is empty!" << endl; return -1; } else { return top->data; // 返回栈顶元素 } } // 析构函数,释放内存 Stack::~Stack() { while (!IsEmpty()) { // 循环弹出栈中所有元素 Pop(); } } // 测试堆栈链式存储的实现 int main() { Stack s; // 创建堆栈对象 // 入栈操作 s.Push(1); s.Push(2); s.Push(3); // 获取栈顶元素 cout << "Top element: " << s.Top() << endl; // 出栈操作 cout << "Pop element: " << s.Pop() << endl; cout << "Pop element: " << s.Pop() << endl; // 获取栈顶元素 cout << "Top element: " << s.Top() << endl; // 出栈操作 cout << "Pop element: " << s.Pop() << endl; // 判断堆栈是否为空 if (s.IsEmpty()) { cout << "Stack is empty!" << endl; } else { cout << "Stack is not empty!" << endl; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值