从屌丝到架构师的飞越(数据结构篇)-堆栈

一.介绍

堆栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

  堆栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为先进后出表(Last In First Out , 简称LIFO)。

比如:堆栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。

二.知识点介绍

1、堆栈原理

2、Stack使用

三.上课对应视频的说明文档

1、堆栈原理

(1) 一图:当栈里面没有任何元素的时候,为空栈,栈顶和栈底在同一个位置

(2) 二图:当A元素进入我们的栈里面后,他所进入的过程叫入栈,栈底不变,栈顶为A元素的上部

(3) 三图:在栈中加入B,C,D三个元素后,栈底不变,栈顶为D元素上部

(4) 四图:D元素被移出,这个过程叫出栈,栈底不变,栈顶发生变化,栈顶为C元素的上部

2、Stack使用

public push(item) 把项压入栈顶。其作用与 addElement (item ) 相同。

参数 item 压入栈顶的项 。 返回: item 参数

public pop () 移除栈顶对象,并作为函数的值 返回该对象。

返回:栈顶对象(Vector 对象的中的最后一项)。

抛出异常 : EmptyStackException 如果堆栈式空的 。。。

public peek() 查看栈顶对象而不移除它。。

返回:栈顶对象(Vector 对象的中的最后一项)。

抛出异常 : EmptyStackException 如果堆栈式空的 。。。

public boolean empty (测试堆栈是否为空。)  当且仅当堆栈中不含任何项时 返回 true,否则 返回 false.

public int search  (object o)  返回对象在堆栈中位置, 以 1 为基数, 如果对象 o是栈中的一项,该方法返回距离 栈顶最近的出现位置到栈顶的距离; 栈中最上端项的距离为 1 。 使用equals 方法比较 o 与 堆栈中的项。。。 

案例:

import java.util.*;

public class StackTest{

public static void main(String args[]){

Stack s=new Stack();//产生一个空栈

s.push("A");

s.push("B");//入栈

s.push("C");

System.out.println(s.peek());//显示栈顶的元素

//System.out.println(s.pop());//显示栈顶的元素,并移出。

System.out.println(s);

System.out.println(s.search("A"));

Iterator i=s.iterator();

while(i.hasNext()){

System.out.println(i.next());

}

/*

while(!s.empty()){

System.out.println(s.peek());

}

System.out.println(s);

*/

}

}

案例:数组实现堆栈

public class ArrayOfStack {

private Object[] stack = null;

private int size;

private int top;

//默认初始化一个栈堆,大小为100

public ArrayOfStack(){

this.size = 100;

this.top = -1;

this.stack = new Object[size];

}

//初始化一个自定义大小的栈堆

public ArrayOfStack(int size){

this.size = size;

this.top = -1;

this.stack = new Object[size];

}

//判断堆栈是否为空

public boolean isEmpty(){

if(top == -1){

return true;

}else

return false;

}

//判断栈堆是否已满

public boolean isFull(){

if(top == (size-1)){

return true;

}else

return true;

}

//入栈操作

public void push(String data){

if(isFull()){

System.out.println("堆栈已满");

return;

}

//入栈开始,top相当于数组下标

top++;

stack[top] = data;

}

//出栈

public Object pop(){

//定义一个临时对象

Object val = null;

//堆栈为空时报错

if(isEmpty()){

System.out.println("堆栈为空");

return val;

}

//获取堆栈值

val = stack[top];

top--;

return val;

}

//获取栈顶元素

public Object peek(){

Object topVal = null;

if(isEmpty()){

System.out.println("栈堆为空!");

return topVal;

}

//取出栈顶元素

topVal = stack[top];

return topVal;

}

//获取堆栈元素

public int size(){

return top+1;

}

//获取栈堆容量

public int capcity(){

return size;

}

}

案例:链表实现堆栈

public class Node {

//链表数据域

Object data;

//链域

Node next;

//构造头结点

public Node(){

this.data = null;

this.next = null;

}

//构造节点

public Node(Object data){

this.data = data;

this.next = null;

}

}

案例:堆栈类

public class LinkOfStack {

//定义一个头结点

private Node head;

//构造头结点

public LinkOfStack(){

head = new Node();

}

//判断是否为空

public boolean empty(){

if(head.next == null)

return true;

else

return false;

}

//堆栈入栈

public void push(Object data){

Node item = new Node(data);

item.next = head.next;

head.next = item;

}

//出栈

public Object pop(){

Object item = null;

if(empty()){

System.out.println("堆栈为空");

}

item = head.next.data;

head.next = head.next.next;

return item;

}

//堆栈大小

public int size(){

int len = 0;

Node p = head;

while(p.next != null){

len++;

p = p.next;

}

return len;

}

//获取栈顶元素

public Object peek(){

if(empty()){

System.out.println("堆栈为空");

}

return head.next.data;

}

public static void main(String[] args){

LinkOfStack stack = new LinkOfStack();

stack.push("测试链表堆栈节点一");

System.out.println(stack.size());

System.out.println(stack.peek());

while(!stack.empty()){

System.out.print(stack.pop()+"-->");

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容