栈 ADT

  栈(stack)是插入和删除只能在一个位置上进行的表(后进先出),该位置是表的末端,叫做栈的顶(top)。对栈的基本操作有 push(进栈) 和 pop(出栈),push 相当于插入,pop 相当于删除。

  左图栈模型说明:通过 push 向栈输入,通过 pop 和 top 从栈输出

  右图栈模型说明:栈顶是栈中唯一可见的元素

  • 栈的数组实现

    public class ArrayStack<T> {
    
        //设置为2是为了检验ensureCapacity()方法的正确性
        private Object[] data = new Object[2];
    
        private int size;
    
        //是否空栈
        public boolean empty() {
            return size == 0;
        }
    
        //进栈
        public void push(T t) {
            ensureCapacity();
            data[size++] = t;
        }
    
        //出栈
        public T pop() {
            //noinspection unchecked
            return (T) data[--size];
        }
    
        //确保容量
        private void ensureCapacity() {
            if (size < data.length) {
                return;
            }
            data = Arrays.copyOf(data, data.length + (data.length >> 1));
        }
    
        public static void main(String[] args) {
            ArrayStack<String> stack = new ArrayStack<>();
            char c[] = "Array Stack".toCharArray();
            for (int i = c.length - 1; i >= 0; i--) {
                stack.push(String.valueOf(c[i]));
            }
            while (!stack.empty()) {
                System.out.print(stack.pop());
            }
        }
    
    }
  • 栈的链表实现

    public class LinkedStack<T> {
    
        private Node<T> node;
    
        private int size;
    
        private class Node<T> {
    
            T item;
    
            Node<T> next;
    
            public Node(T item, Node<T> next) {
                this.item = item;
                this.next = next;
            }
        }
    
        //是否空栈
        public boolean empty() {
            return size == 0;
        }
    
        //进栈
        public void push(T t) {
            Node<T> n = new Node<>(t, node);
            node = n;
            size++;
        }
    
        //出栈
        public T pop() {
            T t = node.item;
            node = node.next;
            size--;
            return t;
        }
    
        public static void main(String[] args) {
            LinkedStack<String> stack = new LinkedStack<>();
            char c[] = "Linked Stack".toCharArray();
            for (int i = c.length - 1; i >= 0; i--) {
                stack.push(String.valueOf(c[i]));
            }
            while (!stack.empty()) {
                System.out.print(stack.pop());
            }
        }
    
    }
时间: 2024-12-24 00:27:36

栈 ADT的相关文章

栈ADT的实现

/* 栈ADT链表实现的类型声明 */ struct Node; typedef struct Ndoe *PtrToNode; typedef PtrToNode Stack; struct Node{ ElementType Element; Stack Next; }; /* 测试是否为空栈 */ int IsEmpty( Stack S ) { return S->Next == NULL; } /* 创建空栈 */ Stack CreateStack(void) { Stack S;

回顾栈ADT的7点

1.简单的说,栈就是只在一个位置上进行插入和删除操作的表,而这个特殊的位置就是表的末端,但这却不被成为栈的末端,而是顶(Top). 2.栈的基本操作时进栈和出栈,英文名分别是push和pop,分别相当于插入和删除.切记对空栈进行pop和top操作在栈ADT被认为是错误的,而如果push在空间之外进行操作也是有实现限制的,但这并不是ADT错误. 3.栈的特点是后进先出,对于学生来说可能用食堂里堆砌起来的餐盘做形容更加合适. 4.栈既可以用单向链表来实现,也可以用数组来实现.用单向链表自然是比较简单

《数据结构与算法分析》学习笔记(四)——栈ADT

一.栈ADT是what? 1.定义 栈,是限制插入和删除都只能在一个位置上进行的表. 2.图示 3.栈的基本功能 (1)是否为空 (2)进栈 (3)出栈 (4)清空 (5)取栈顶 二.栈的链表实现 <数据结构与算法分析>学习笔记(四)--栈ADT

栈ADT的数组实现

/* 栈的数组实现声明 */ struct StackRecord; typedef struct StackRecord *Stack; #define MinSstackSize 5 #define EmptyTOS -1 struct StackRecord { int Capacity; int TopOfStack; ElementType *Array; }; /* 栈的创建-数组实现 */ Stack CreateStack( int MaxElements ) { Stack S

两种实现栈ADT的方式

栈是一种先进后出或说是后进先出的数据结构,书中介绍了两种简单实现方法,其中使用链表的是比较方便的方式,而是用数组的方式效率比较高,但是需要初始化的时候指明最大数组元素上限个数. 下面是简单实现: 1. 链表方式 ListStack.cpp 1 /*栈的数组实现*/ 2 #include "iostream" 3 #include "stdlib.h" 4 5 #define log(s); std::cout<<s<<std::endl; 6

[BS]栈 ADT

栈有两种实现方式:单链表.数组 本文是单链表实现方式的基本操作. 数据结构: struct Node { ElementType Element; PtrToNode Next; }; 数据类型: typedef int ElementType; typedef struct Node *PtrToNode; typedef PtrToNode Stack; 基本操作: /* Return 1 if stack is NULL */ int IsEmpty( Stack S ) { return

LIFO栈 ADT接口 链表实现

LIFO 链栈结构 1 typedef int ElemType; 2 struct node{ 3 ElemType data; 4 struct node* next; 5 }; 6 typedef struct node* LinkedStack; LIFO 链栈基本操作 1 //LIFO 链栈初始化 2 void InitStack(LinkedStack top){ 3 top = NULL; 4 } 5 6 //LIFO 链栈判断栈空 7 boolean StackKEmpty(Li

第三章节 表,栈,队列

抽象数据类型(abstract data type ADT)是带有一组操作的对象的集合. 一. 表ADT 表的数组实现  数组实现时,插入和删除的花费可能会比较大,这样要看操作发生在什么地方.最坏情况如,在0处插入,和删除第一个元素.此时为O(N). 如果表是通过在高端插入,其后只发生对数组的查找访问(findKth),则数组很适合.否则,不是. 简单链表 为了避免插入和删除的线性开销,应该使表可以不连续存储.否则表的每个部分都可能要整体移动.这样就是链表. findKth(i)要花费O(i)的

&lt;数据结构与算法分析 C++描述&gt; 表/栈/队列

这一章主要内容: * 抽象数据类型(ADT)的概念 * 实现表/栈/队列 * 了解这三个数据结构的应用场景 1. ADT ADT: abstract data type, 是抽象的数学模型,在该模型上定义了一系列的操作.使用它的人,不需要了解它的存储方式,只关心它的逻辑特征.可以使用三元组的方法来表示(D,S,P),D是数据对象,S是数据之间的关系,P是对数据的基本操作,具体介绍,可以参考帖子:点击打开链接 2. 表ADT 表的数据自然是单个元素,而元素之间的关系是前驱与后继,操作包括查找/插入