关键词:
栈(stack)
栈也是一种线性数据结构,只能从栈顶一段添加/取出元素;
类似于单口试管;后进先出
Last In First Out(LIFO)
栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作
进栈、入栈或压栈
,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈
,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。
栈可以用来在函数调用的时候存储断点,做递归时要用到栈!
案例:
例如有三个方法: A, B, C;在A执行中,调用B方法,在B执行时,调用C方法.
对于栈来说, 先把main方法入栈; main方法中调用了A; 把A入栈, 此时A调用到B; 把B入栈; B调用到C了;
把C入栈, 执行完C; C弹出栈;再继续执行B; B弹出栈;再继续执行A; A弹出栈; 最后再将main方法弹出栈.
public class Demo
public static void main(String[] args)
A();
public static void A()
System.out.println("A执行一步.");
B();
System.out.println("A执行2步.");
public static void B()
System.out.println("B执行一步");
C();
System.out.println("B执行2步.");
public static void C()
System.out.println("C执行一步.");
//执行过程
/*
A执行一步.
B执行一步
C执行一步.
B执行2步.
A执行2步.
* */
栈的具体实现
类似于数组,但是由于仅有栈顶控制进出的特殊性,所以具体实现方法比较简单
Class Stack
构造方法 Stack( ) 创建一个空堆栈。
方法:
返回值 | 方法 |
---|---|
boolean | empty( ) 测试此堆栈是否为空。 |
E | push(E item) 添加方法;将元素推送到此堆栈的顶部 |
E | pop( ) 删除此堆栈顶部的对象,并将该对象作为此函数的值返回 |
E | peek( ) 查看此堆栈顶部的对象,而不是从堆栈中删除它 |
int | search(Object o) 返回一个对象在此堆栈上的基于1的位置 |
自定义栈的基本操作实现
首先自定义栈的基本操作接口;
/**
* 自定义栈的基本操作接口;
* @param <E> 泛型;数据类型;
* @author 小智
* @create 2021-07-22 17:08
*/
public interface MyStack<E>
/**
* 获取栈中的实际元素个数;
*/
int getSize();
/**
* 判断栈是否为空栈;
*/
boolean isEmpty();
/**
* 入栈;
* @param element 需要添加的元素;
*/
void push(E element);
/**
* 出栈;
*/
E pop();
/**
* 查看栈顶元素;
*/
E peek();
自定义栈的基本操作实现类:
/**
* 自定义栈的基本操作实现类;
* @author 小智
* @create 2021-07-22 17:19
*/
public class MyStackImpl<E> implements MyStack<E>
/**
* 数据容器(使用自定义数组中的data);
*/
private MyselfArray<E> data;
/**
* 栈的实际元素个数;
*/
private int size;
/**
* 无参构造;
*/
public MyStackImpl()
data = new MyselfArray<>();
size = 0;
/**
* 有参构造;
* @param capacity 栈的容量;
*/
public MyStackImpl(int capacity)
data=new MyselfArray<>(capacity);
/**
* 获取栈中的实际元素个数;
* @return int类型; 实际元素个数
*/
@Override
public int getSize()
return this.size;
/**
* 判断栈是否为空栈;
* @return boolean类型; (true:空栈| false:不是空栈)
*/
@Override
public boolean isEmpty()
return this.size == 0;
/**
* 入栈;
* @param element 需要添加的元素;
*/
@Override
public void push(E element)
try
//调用自定义数组的数组尾部添加元素方法;
data.addTail(element);
//元素数量加 1 ;
size++;
catch (IllegalAccessException e)
e.printStackTrace();
/**
* 出栈;
* @return E类型; 栈顶元素;
*/
@Override
public E pop()
E result = null;
try
//调用自定义数组的数组删除尾部元素方法;
result = data.removeTail();
//元素数量减 1 ;
size--;
catch (IllegalAccessException e)
e.printStackTrace();
return result;
/**
* 查看栈顶元素;
* @return E类型; 栈顶元素;
*/
@Override
public E peek()
try
//调用自定义数组的数组查找尾部元素方法;
return data.getTail();
catch (IllegalAccessException e)
e.printStackTrace();
return null;
/**
* 输出栈;
*/
@Override
public String toString()
StringBuilder sbl = new StringBuilder();
//追加输出格式;
sbl.append("栈的容量大小为:"+data.getCapacity()+" 栈中的实际元素个数:"+size).append(" 栈底 <");
try
//循环遍历栈中的元素;注意栈中的元素存在自定义的数组中;
for (int i = 0; i < this.size; i++)
sbl.append(data.getEleByIndex(i));
//追加分隔符;
if (i != size - 1)
sbl.append(",");
sbl.append("> 栈顶");
//调用返回StringBuilder的toString方法;
return sbl.toString();
catch (IllegalAccessException e)
e.printStackTrace();
return null;
/**
* 输出栈方式 2; 输出时将栈中的元素全部弹出;
*/
public String toString2()
StringBuilder sbl = new StringBuilder();
//追加输出格式;
sbl.append("栈的容量大小为:" + data.getCapacity() + " 栈中的实际元素个数:" + size).append(" 栈顶位置<<<");
//只要栈不为空;就出栈,存入字符串sbl;
while (!this.isEmpty())
sbl.append(this.pop() + "<<<");
return sbl.substring(0, sbl.lastIndexOf("<") - 2).toString();
- 自定义栈的时间复杂度
push(E element)
入栈
; pop出栈
; peek查看栈顶元素
; getSize查看栈的实际元素个数
;isEmpty判断栈是否为空栈
时间复杂度均为O(1)
栈是线性表的特例;那么栈的顺序存储也是线性表顺序存储的简化,(顺序栈
);而线性表是用数组实现,下标为0的一端作为栈底;首元素存到栈底,变化量小.
定义一个变量top:(栈顶元素在数组中的位置),定义StackSize作为栈的长度;top要小于StackSize;
当栈仅存在一个元素时,top为0,则空栈为top= -1
我理解的数据结构——栈(stack)(代码片段)
我理解的数据结构(二)——栈(Stack)一、栈基础栈是一种线性结构相比较数组,栈对应的操作是数组的子集只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶栈是一种后进先出的数据结构,LIFO(LastInFirstOut)... 查看详情
数据结构:栈(代码片段)
...栈(Stack),也叫堆栈。但是不能称为堆,堆是另外一种数据结构FILO栈遵循先进后出的原则(FirstInLastOut)基本操作有:入栈(压栈)、出栈(退栈)入栈和出栈都是针对栈顶的操作二、结构示意图依次将a、b、c元素压进一个空... 查看详情
栈--原地reverse栈(代码片段)
思路不用其他数据结构,用递归实现原地逆置需要设计两个递归函数:递归函数1:将栈底元素返回并且移除递归函数2:使用到函数1的reverse方法代码classStackReversepublicintgetAndRemoveLastElement(Stack<Integer>stack)inttop=stack.pop();//注意... 查看详情
数据结构--栈(stack)(代码片段)
...的定义定义:栈:一种先进后出,后进先出的数据结构(如箱子存放东西)栈和队列都是受到限制的顺序表栈分为顺序栈和链式栈栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端... 查看详情
队列栈和递归遍历目录(代码片段)
栈栈是一种内存结构,先进后出,后进先出。python中没有栈的概念,我们目前只能仿写。 #模拟栈结构stack=[]#入栈(添加元素)stack.append("A")print(stack)stack.append("B")print(stack)stack.append("C")print(stack)#入栈顺序ABC#出栈(移除元素)... 查看详情
栈(stack)(代码片段)
...的删除操作叫做出栈。出数据在栈顶二,栈的操作 代码示例 查看详情
剑指offer09.用两个栈实现队列(代码片段)
...中添加数据从stack2中弹出数据——从队列中删除头部数据代码importjava.util.Stack;classCQueueStack<Integer>stack1;Stack<Integer>stack2;publicCQueue 查看详情
数据结构——16栈数组描述(代码片段)
栈——数组描述栈——进栈、出栈、打印(数组描述)#include<iostream>usingnamespacestd;classStackpublic: Stack(intinitialCapacity)//构造函数 size=initialCapacity; stack=newint[size]; top=-1; voidpush(intelement);//进栈 intpop() //出栈直接返回... 查看详情
java集合与数据结构栈和队列(代码片段)
Java集合与数据结构栈和队列栈(Stack)基本方法栈的习题出栈顺序不可能中缀表达式转后缀表达式(逆波兰式)手动实现栈队列(Queue)基本方法链表实现队列循环队列用队列实现栈用栈实现队列括号匹配问题实现一个最小栈... 查看详情
数据结构与算法之stack(栈)——indart(代码片段)
用dart语言实现一个简单的stack(栈)。1classStack<E>2finalList<E>_stack;3finalintcapacity;4int_top;56Stack(this.capacity)7:_top=-1,8_stack=List<E>(capacity);910boolgetisEmpty=>_top==-1;11boolgetisFull=>_top==capacity-1;12intgetsize=>_top+1;1314voidpush(Ee)15if... 查看详情
恋上数据结构栈stack(代码片段)
GItee同步更新五、Stack栈文章目录五、Stack栈1.栈接口的设计2.手写Stack3.应用实例栈是一种特殊的线性表,只能在一端进行操作。往栈中添加元素的操作,一般叫做push入栈从栈中移除元素的操作,一般叫做pop出栈(只能... 查看详情
数据结构学习栈(代码片段)
线性结构-栈栈介绍实际需求输入表达式计算:722-5+1-5+3-3,计算机底层是如何得到的呢?基本介绍栈的英文为(stack)栈是一个先进后出的有序列表栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特... 查看详情
剑指offer用两个栈实现队列python(代码片段)
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。思路定义两个栈stack1,stack2,stack1负责存数据,stack2负责辅助完成队列的弹出。stack1维持一个队列的顺序,stack1栈底数据是最先压入的,弹... 查看详情
数据结构之栈队列循环队列(代码片段)
二、数据结构之栈、队列、循环队列顺序栈Stack.h结构类型,函数声明:#ifndef_STACK_H_#define_STACK_H_typedefintSElementType;///顺序栈#defineSTACK_INIT_SIZE20#defineSTACK_INCREMENT10typedefstructSElementType*base;SElementType*top;intsta 查看详情
数据结构栈(代码片段)
1#include<stdio.h>2#include<stdlib.h>34#defineM1005typedefintElemType;6typedefstruct78ElemTypedata[M];9inttop;10Stack;1112//初始化栈13voidInitStack(Stack*s)1415s->top=-1;1617intPush(Stack*s,ElemTypee)1819if(s->top==M-1)2021printf("栈满");22return0;2324s->top++;25s->data... 查看详情
数据结构栈与队列(代码片段)
栈栈满足下列两点:1.栈只能从表的一端存取数据,另一端是封闭的。2.在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。总结:栈是一种只能从表的一端存取数据且遵循"... 查看详情
数据结构-栈(代码片段)
栈是一种基本的数据结构基本概念栈(Stack):具有一定操作约束的线性表。只在一端(栈顶,Top)做插入、删除操作插入数据:入栈(Push)删除数据:出栈(Pop)后入先出:LastInFirstOut(LIFO)抽象数据类型描述类型名称:栈数据对象集:一... 查看详情
3)数据结构之线性表(栈与队列)(代码片段)
目录栈与队列的本质栈的基本概念栈的物理结构栈的顺序存储结构(用数组实现)静态栈的实现: Stack.h中Test/c中Stack.c中输出结果动态栈的实现 Stac.h中Test.c中Stack.c中栈的链式存储结构(使用链表实现) Stack... 查看详情