Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243305
  • 博文数量: 164
  • 博客积分: 60
  • 博客等级: 民兵
  • 技术积分: 1129
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 21:55
文章分类

全部博文(164)

文章存档

2017年(2)

2015年(67)

2014年(95)

我的朋友

分类: Java

2015-05-03 11:27:06


栈的定义  


      栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。  


    (1)通常称插入、删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom)。  


    (2)当表中没有元素时称为空栈。  


    (3)栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表。  


    栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中


最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部, 


要到最后才能删除。

    

    

【示例】元素是以a1a2,…,an的顺序进栈,退栈的次序却是anan-1,…, 


a1。  

 

2、栈的基本运算  


 (1InitStackS)  


      构造一个空栈S。  


 (2StackEmptyS)  


      判栈空。若S为空栈,则返回TRUE,否则返回FALSE。  


 (3StackFullS)  


      判栈满。若S为满栈,则返回TRUE,否则返回FALSE。  


注意: 该运算只适用于栈的顺序存储结构。  


 (4PushSx)  


      进栈。若栈S不满,则将元素x插入S的栈顶。  


 (5PopS

定义堆栈ADT
    

点击(此处)折叠或打开

  1. public interface StackADT {
  2.     public void push(Object element);//压栈
  3.     public Object pop();//出栈
  4.     public boolean isEmpty();
  5.     public int size();
  6.     public Object peek();//返回栈顶对象的一个引用
  7.     public String toString();
  8. }

链式实现:
    

点击(此处)折叠或打开

  1. public class LinkedStack implements StackADT {
  2.     private LinearNode top; //指向栈顶
  3.     private int count;//标记栈的大小
  4.     public static void main(String[] args){
  5.         LinkedStack stack = new LinkedStack();
  6.         System.out.println("将0到10依次压栈");
  7.         for(int i = 0;i < 10;i++)
  8.             stack.push(i);
  9.         System.out.println("连续执行5次出栈操作");
  10.         for(int i = 0;i < 5;i++)
  11.             stack.pop();
  12.         System.out.println("栈为空吗?: " + stack.isEmpty());
  13.         System.out.println("栈的大小为: " + stack.size());
  14.         System.out.println("栈顶元素为: " + stack.top.getElement());
  15.         System.out.println("栈顶元素为: " + stack.peek());
  16.     }
  17.     public LinkedStack()
  18.     {
  19.         top = null;
  20.         count = 0;
  21.     }
  22.     public int size() {
  23.         return count;
  24.     }
  25.     public boolean isEmpty() {
  26.         return (size() == 0);
  27.     }
  28.     public void push(Object element) {
  29.         LinearNode node = new LinearNode(element);
  30.         node.setNext(top);
  31.         top = node;
  32.         count++;
  33.     }
  34.     public Object pop() {
  35.         if(isEmpty())
  36.         {
  37.             System.out.println("stack is empty!");
  38.             System.exit(1);
  39.         }
  40.         Object result = top.getElement();
  41.         top = top.getNext();
  42.         count--;
  43.         return result;
  44.     }
  45.     public Object peek() {
  46.         Object result = top.getElement();
  47.         return result;
  48.     }
  49. }
运行结果:
010依次压栈
连续执行5次出栈操作
栈为空吗?: false
栈的大小为: 5
栈顶元素为: 4
栈顶元素为: 4

数组实现:
    

点击(此处)折叠或打开

  1. public class ArrayStack implements StackADT {
  2.     private Object[] contents;
  3.     private int top;//top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!
  4.     private static int SIZE = 10;
  5.     public ArrayStack()
  6.     {
  7.         contents = new Object[SIZE];
  8.         top = 0;
  9.     }
  10.     public void expand(){//借助于申请一个辅助空间,每次扩展容量一倍
  11.         Object[] larger = new Object[size()*2];
  12.         for(int index = 0;index < top;index++)
  13.             larger[index] = contents[index];
  14.         contents = larger;
  15.     }
  16.     public int size() {
  17.         return top;
  18.     }
  19.     public boolean isEmpty() {
  20.         return (size() == 0);
  21.     }
  22.     public void push(Object element) {
  23.         //if(isEmpty())
  24.             //expand();
  25.         if(top == contents.length)
  26.             expand();
  27.         contents[top] = element;
  28.         top++;
  29.     }
  30.     public Object pop() {
  31.         if(isEmpty())
  32.         {
  33.             System.out.println("stack is empty!");
  34.             System.exit(1);
  35.         }
  36.         Object result = contents[top-1];
  37.         contents[top-1] = null;//出栈
  38.         top--;
  39.         return result;
  40.         /*书上这样写简便一点:::
  41.          * top--;
  42.          * Object result = contents[top];
  43.          * contents[top] = null;*/
  44.     }
  45.     public Object peek() {
  46.         Object result;
  47.         if(isEmpty())
  48.             result = null;
  49.         else
  50.             result = contents[top-1];
  51.         return result;
  52.     }
  53.     public static void main(String[] args) {
  54.         ArrayStack stack = new ArrayStack();
  55.         System.out.println("将0到24依次压栈,然后连续10次出栈");
  56.         for(int i = 0;i < 25;i++)
  57.             stack.push(i);
  58.         for(int i = 0;i < 10;i++)
  59.             stack.pop();
  60.         System.out.println("栈的大小为: " + stack.size());
  61.         System.out.println("栈为空吗?: " + stack.isEmpty());
  62.         System.out.println("栈顶元素为: " + stack.peek());
  63.     }
  64. }
运行结果:
024依次压栈,然后连续10次出栈
栈的大小为: 15
栈为空吗?: false
栈顶元素为: 14 

阅读(501) | 评论(0) | 转发(0) |
0

上一篇:双向链表

下一篇:队列

给主人留下些什么吧!~~