原文出处:http://www.cnblogs.com/skywang12345/p/3562239.html

注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈

1. 栈的介绍

栈(stack)是限定仅在表尾一端进行插入或删除操作的特殊线性表。对于栈来说, 允许进行插入或删除操作的一端称为栈顶(top),而另一端称为栈底(bottom)。不含元素栈称为空栈,向栈中插入一个新元素称为入栈或压栈, 从栈中删除一个元素称为出栈或退栈。

假设有一个栈S=(a1, a2, …, an), a1先进栈, an最后进栈。称a1为栈底元素, an为栈顶元素, 如图3.1所示。出栈时只允许在栈顶进行, 所以an先出栈, a1最后出栈。因此又称栈为后进先出(Last In First Out,LIFO)的线性表。

栈(stack),是一种线性存储结构,它有以下几个特点:

  • 栈中数据是按照”后进先出(LIFO, Last In First Out)”方式进出栈的。
  • 向栈中添加/删除数据时,只能从栈顶进行操作。

栈通常包括的三种操作:push、peek、pop。

  • push – 向栈中添加元素。
  • peek – 返回栈顶元素。
  • pop – 返回并删除栈顶元素的操作。

1.1 栈的示意图

栈中的数据依次是 30 –> 20 –> 10

1.2 出栈

出栈前:栈顶元素是30。此时,栈中的元素依次是 30 –> 20 –> 10
出栈后:30出栈之后,栈顶元素变成20。此时,栈中的元素依次是 20 –> 10

1.3 入栈

入栈前:栈顶元素是20。此时,栈中的元素依次是 20 –> 10
入栈后:40入栈之后,栈顶元素变成40。此时,栈中的元素依次是 40 –> 20 –> 10

2. 栈的Java实现

JDK包中也提供了”栈”的实现,它就是集合框架中的Stack类。本部分给出2种Java实现

2.1 Java实现一

数组实现的栈,能存储任意类型的数据

/*** Java : 数组实现的栈,能存储任意类型的数据*/
import java.lang.reflect.Array;public class GeneralArrayStack<T> {private static final int DEFAULT_SIZE = 12;private T[] mArray;private int count;public GeneralArrayStack(Class<T> type) {this(type, DEFAULT_SIZE);}public GeneralArrayStack(Class<T> type, int size) {// 不能直接使用mArray = new T[DEFAULT_SIZE];mArray = (T[]) Array.newInstance(type, size);count = 0;}// 将val添加到栈中public void push(T val) {mArray[count++] = val;}// 返回“栈顶元素值”public T peek() {return mArray[count-1];}// 返回“栈顶元素值”,并删除“栈顶元素”public T pop() {T ret = mArray[count-1];count--;return ret;}// 返回“栈”的大小public int size() {return count;}// 返回“栈”是否为空public boolean isEmpty() {return size()==0;}// 打印“栈”public void PrintArrayStack() {if (isEmpty()) {System.out.printf("stack is Empty\n");}System.out.printf("stack size()=%d\n", size());int i=size()-1;while (i>=0) {System.out.println(mArray[i]);i--;}}public static void main(String[] args) {String tmp;GeneralArrayStack<String> astack = new GeneralArrayStack<String>(String.class);// 将10, 20, 30 依次推入栈中astack.push("10");astack.push("20");astack.push("30");// 将“栈顶元素”赋值给tmp,并删除“栈顶元素”tmp = astack.pop();System.out.println("tmp="+tmp);// 只将“栈顶”赋值给tmp,不删除该元素.tmp = astack.peek();System.out.println("tmp="+tmp);astack.push("40");astack.PrintArrayStack();    // 打印栈}
}

运行结果:

tmp=30
tmp=20
stack size()=3
40
20
10

结果说明:GeneralArrayStack是通过数组实现的栈,而且GeneralArrayStack中使用到了泛型

2.2 Java实现二

Java的 Collection集合 中自带的”栈”(stack)的示例

import java.util.Stack;/*** Java : java集合包中的Stack的演示程序*/
public class StackTest {public static void main(String[] args) {int tmp=0;Stack<Integer> astack = new Stack<Integer>();// 将10, 20, 30 依次推入栈中astack.push(10);astack.push(20);astack.push(30);// 将“栈顶元素”赋值给tmp,并删除“栈顶元素”tmp = astack.pop();//System.out.printf("tmp=%d\n", tmp);// 只将“栈顶”赋值给tmp,不删除该元素.tmp = (int)astack.peek();//System.out.printf("tmp=%d\n", tmp);astack.push(40);while(!astack.empty()) {tmp = (int)astack.pop();System.out.printf("tmp=%d\n", tmp);}}
}

运行结果:

tmp=40
tmp=20
tmp=10

3. Stack详细介绍

学完Vector了之后,接下来我们开始学习Stack。Stack很简单,它继承于Vector。学习方式还是和之前一样,先对Stack有个整体认识,然后再学习它的源码;最后再通过实例来学会使用它。内容包括:

  • 第1部分 Stack介绍
  • 第2部分 Stack源码解析(基于JDK1.6.0_45)
  • 第3部分 Vector示例

3.1 Stack介绍

Stack是栈。它的特性是:先进后出(FILO, First In Last Out)。

java工具包中的Stack是继承于Vector(矢量队列)的,由于Vector是通过数组实现的,这就意味着,Stack也是通过数组实现的,而非链表。当然,我们也可以将LinkedList当作栈来使用!在“Java 集合系列06之 Vector详细介绍(源码解析)和使用示例”中,已经详细介绍过Vector的数据结构,这里就不再对Stack的数据结构进行说明了。

3.2 Stack的继承关系

java.lang.Object
↳     java.util.AbstractCollection<E>↳     java.util.AbstractList<E>↳     java.util.Vector<E>↳     java.util.Stack<E>public class Stack<E> extends Vector<E> {}

Stack和Collection的关系如下图

4. 栈

4.1 用LinkedList实现栈结构的集合

public class MyStack {private LinkedList link;public MyStack() {link = new LinkedList();}public void add(Object obj) {link.addFirst(obj);}public Object get() {// return link.getFirst();return link.removeFirst();}public boolean isEmpty() {return link.isEmpty();}
}

4.2 栈的实现

// stack.java
// demonstrates stacks
// to run this program: C>java StackApp

class StackX{private int maxSize;        // size of stack arrayprivate long[] stackArray;private int top;            // top of stack
//--------------------------------------------------------------public StackX(int s)         // constructor{maxSize = s;             // set array sizestackArray = new long[maxSize];  // create arraytop = -1;                // no items yet}
//--------------------------------------------------------------public void push(long j)    // put item on top of stack{stackArray[++top] = j;     // increment top, insert item}
//--------------------------------------------------------------public long pop()           // take item from top of stack{return stackArray[top--];  // access item, decrement top}
//--------------------------------------------------------------public long peek()          // peek at top of stack{return stackArray[top];}
//--------------------------------------------------------------public boolean isEmpty()    // true if stack is empty{return (top == -1);}
//--------------------------------------------------------------public boolean isFull()     // true if stack is full{return (top == maxSize-1);}
//--------------------------------------------------------------}  // end class StackX

class StackApp{public static void main(String[] args){StackX theStack = new StackX(10);  // make new stacktheStack.push(20);               // push items onto stacktheStack.push(40);theStack.push(60);theStack.push(80);while( !theStack.isEmpty() )     // until it's empty,{                             // delete item from stacklong value = theStack.pop();System.out.print(value);      // display itSystem.out.print(" ");}  // end whileSystem.out.println("");}  // end main()}  // end class StackApp

4.3 栈实例1:单词逆序

// reverse.java
// stack used to reverse a string
// to run this program: C>java ReverseApp
import java.io.*;                 // for I/O

class StackX{private int maxSize;private char[] stackArray;private int top;
//--------------------------------------------------------------public StackX(int max)    // constructor{maxSize = max;stackArray = new char[maxSize];top = -1;}
//--------------------------------------------------------------public void push(char j)  // put item on top of stack{stackArray[++top] = j;}
//--------------------------------------------------------------public char pop()         // take item from top of stack{return stackArray[top--];}
//--------------------------------------------------------------public char peek()        // peek at top of stack{return stackArray[top];}
//--------------------------------------------------------------public boolean isEmpty()  // true if stack is empty{return (top == -1);}
//--------------------------------------------------------------}  // end class StackX

class Reverser{private String input;                // input stringprivate String output;               // output string
//--------------------------------------------------------------public Reverser(String in)           // constructor{ input = in; }
//--------------------------------------------------------------public String doRev()                // reverse the string{int stackSize = input.length();   // get max stack sizeStackX theStack = new StackX(stackSize);  // make stackfor(int j=0; j<input.length(); j++){char ch = input.charAt(j);     // get a char from inputtheStack.push(ch);             // push it}output = "";while( !theStack.isEmpty() ){char ch = theStack.pop();      // pop a char,output = output + ch;          // append to output}return output;}  // end doRev()
//--------------------------------------------------------------}  // end class Reverser

class ReverseApp{public static void main(String[] args) throws IOException{String input, output;while(true){System.out.print("Enter a string: ");System.out.flush();input = getString();          // read a string from kbdif( input.equals("") )        // quit if [Enter]break;// make a ReverserReverser theReverser = new Reverser(input);output = theReverser.doRev(); // use itSystem.out.println("Reversed: " + output);}  // end while}  // end main()
//--------------------------------------------------------------public static String getString() throws IOException{InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);String s = br.readLine();return s;}
//--------------------------------------------------------------}  // end class ReverseApp

4.4 栈实例2:分隔符匹配

// brackets.java
// stacks used to check matching brackets
// to run this program: C>java bracketsApp
import java.io.*;                 // for I/O

class StackX{private int maxSize;private char[] stackArray;private int top;
//--------------------------------------------------------------public StackX(int s)       // constructor{maxSize = s;stackArray = new char[maxSize];top = -1;}
//--------------------------------------------------------------public void push(char j)  // put item on top of stack{stackArray[++top] = j;}
//--------------------------------------------------------------public char pop()         // take item from top of stack{return stackArray[top--];}
//--------------------------------------------------------------public char peek()        // peek at top of stack{return stackArray[top];}
//--------------------------------------------------------------public boolean isEmpty()    // true if stack is empty{return (top == -1);}
//--------------------------------------------------------------}  // end class StackX

class BracketChecker{private String input;                   // input string
//--------------------------------------------------------------public BracketChecker(String in)        // constructor{ input = in; }
//--------------------------------------------------------------public void check(){int stackSize = input.length();      // get max stack sizeStackX theStack = new StackX(stackSize);  // make stackfor(int j=0; j<input.length(); j++)  // get chars in turn{char ch = input.charAt(j);        // get charswitch(ch){case '{':                      // opening symbolscase '[':case '(':theStack.push(ch);          // push thembreak;case '}':                      // closing symbolscase ']':case ')':if( !theStack.isEmpty() )   // if stack not empty,{char chx = theStack.pop();  // pop and checkif( (ch=='}' && chx!='{') ||(ch==']' && chx!='[') ||(ch==')' && chx!='(') )System.out.println("Error: "+ch+" at "+j);}else                        // prematurely emptySystem.out.println("Error: "+ch+" at "+j);break;default:    // no action on other charactersbreak;}  // end switch}  // end for// at this point, all characters have been processedif( !theStack.isEmpty() )System.out.println("Error: missing right delimiter");}  // end check()
//--------------------------------------------------------------}  // end class BracketChecker

class BracketsApp{public static void main(String[] args) throws IOException{String input;while(true){System.out.print("Enter string containing delimiters: ");System.out.flush();input = getString();     // read a string from kbdif( input.equals("") )   // quit if [Enter]break;// make a BracketCheckerBracketChecker theChecker = new BracketChecker(input);theChecker.check();      // check brackets}  // end while}  // end main()
//--------------------------------------------------------------public static String getString() throws IOException{InputStreamReader isr = new InputStreamReader(System.in);BufferedReader br = new BufferedReader(isr);String s = br.readLine();return s;}
//--------------------------------------------------------------}  // end class BracketsApp

4.5 栈的链表实现

// linkStack.java
// demonstrates a stack implemented as a list
// to run this program: C>java LinkStackApp

class Link{public long dData;             // data itempublic Link next;              // next link in list
// -------------------------------------------------------------public Link(long dd)           // constructor{ dData = dd; }
// -------------------------------------------------------------public void displayLink()      // display ourself{ System.out.print(dData + " "); }}  // end class Link

class LinkList{private Link first;            // ref to first item on list
// -------------------------------------------------------------public LinkList()              // constructor{ first = null; }           // no items on list yet
// -------------------------------------------------------------public boolean isEmpty()       // true if list is empty{ return (first==null); }
// -------------------------------------------------------------public void insertFirst(long dd) // insert at start of list{                           // make new linkLink newLink = new Link(dd);newLink.next = first;       // newLink --> old firstfirst = newLink;            // first --> newLink}
// -------------------------------------------------------------public long deleteFirst()      // delete first item{                           // (assumes list not empty)Link temp = first;          // save reference to linkfirst = first.next;         // delete it: first-->old nextreturn temp.dData;          // return deleted link}
// -------------------------------------------------------------public void displayList(){Link current = first;       // start at beginning of listwhile(current != null)      // until end of list,{current.displayLink();   // print datacurrent = current.next;  // move to next link}System.out.println("");}
// -------------------------------------------------------------}  // end class LinkList

class LinkStack{private LinkList theList;
//--------------------------------------------------------------public LinkStack()             // constructor{theList = new LinkList();}
//--------------------------------------------------------------public void push(long j)     // put item on top of stack{theList.insertFirst(j);}
//--------------------------------------------------------------public long pop()            // take item from top of stack{return theList.deleteFirst();}
//--------------------------------------------------------------public boolean isEmpty()       // true if stack is empty{return ( theList.isEmpty() );}
//--------------------------------------------------------------public void displayStack(){System.out.print("Stack (top-->bottom): ");theList.displayList();}
//--------------------------------------------------------------}  // end class LinkStack

class LinkStackApp{public static void main(String[] args){LinkStack theStack = new LinkStack(); // make stacktheStack.push(20);                    // push itemstheStack.push(40);theStack.displayStack();              // display stacktheStack.push(60);                    // push itemstheStack.push(80);theStack.displayStack();              // display stacktheStack.pop();                       // pop itemstheStack.pop();theStack.displayStack();              // display stack}  // end main()}  // end class LinkStackApp

Java数据结构与算法:栈相关推荐

  1. char栈java,Java数据结构与算法-栈和队列(示例代码)

    (摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照"先进后出&qu ...

  2. Java数据结构与算法---栈(数组存储)

    今天用Java实现了数据结构中的栈,学会了操纵栈的一系列方法.关于栈的相关内容这里不做介绍,我只是将自己实现的代码分享出来,记录自己的学习进度同时希望能对其他朋友具有借鉴作用. 以下是用数组存储实现栈 ...

  3. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  4. JAVA数据结构与算法【简单介绍】

    前几天去面一个大厂,面试官特别好,面试官说到,我们的学习不能本末倒置,数据结构和算法是程序的基础,如果数据结构你没有学好,你真正意义上不算会写代码.你的代码是各处粘贴,杂乱无章的. 由于现在大多用JA ...

  5. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  6. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  7. java数据结构与算法之顺序表与链表深入分析

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结 ...

  8. Java数据结构与算法(二)

    Java数据结构与算法(二) 第六章 递归 1 递归应用场景 2 递归的概念 3 递归调用机制 4 递归能解决什么样的问题 5 递归需要遵守的重要规则 6 递归-迷宫问题 6.1 迷宫问题 6.2 代 ...

  9. 数据结构与算法-栈与队列

    数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...

  10. java数据结构与算法之双链表设计与实现

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: java数据结 ...

最新文章

  1. 深度学习已入末路,谁能引领下一代AI?
  2. 图解四种启动模式 及 实际应用场景解说
  3. python图像隐写技术_图像隐写技术(Image Steganography)
  4. 处理Xcode8输出无用的Log信息
  5. xml配置文件的形式 VS 配置类的形式
  6. TensorFlow官方教程翻译:导入数据
  7. SQL Server Agent 服务启动后又停止
  8. Schneider TM200CE40U 通讯与编程
  9. 求素数 java 101 200_JAVA编程题2 101——200素数个数
  10. AD-001 CR11220纽扣电池库文件
  11. python字符串后面添加字符串_Python字符串中添加、插入特定字符的方法
  12. 鹏保宝 v7.1.0 官方版
  13. java 修改图片后缀名,不改变图片前缀名
  14. 2020-10-20 Ant Design Vue 关闭国际化设置默认语言为中文的
  15. FFmpeg音视频播放器系列(第三篇:seek实现播放进度控制)
  16. css3 滤镜效果(黑白滤镜、模糊化处理等)
  17. Chapter4.4:根轨迹法
  18. 大学宿舍恶性负载识别智能限电系统
  19. 谷歌浏览器插件HackBar安装方法(详细教程)
  20. 浅谈现在完成时被动语态

热门文章

  1. 现任明教教主共享胖AP与WLC安全配置录像.上半部分
  2. cas单点登陆。就这一篇就够了!!!!!
  3. Python学习之路1 - 基础入门
  4. linux与unix时间戳互转
  5. sublime部署开发环境
  6. 用C#开发的双色球走势图(原创)值得园友拥有(二)接上一篇
  7. Unity 4.3 2D 教程:新手上路
  8. Transact-SQL 示例 - 查询某个数据库内的所有表的记录行数及其总和
  9. 第一次接触 SharpHsql(纯C#开源数据库引擎)
  10. Cortex-M家族发展史,简述Cortex-M0~M4的各个优势