• 大话数据结构(九)——栈


    1、栈的定义

    栈(stack)是限定仅在表尾进行插入和删除操作的线性表

    允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何元素的栈称为空栈,栈又称后进先出(Last In First Out)的线性表,简称LIFO结构。

    注意:

    1)栈是个线性表,栈元素具有线性关系,即前驱后继的关系。

    2)它是一种特殊的线性表,只在表尾进行插入和删除,表尾指的是栈顶。

    3)栈底是固定的,最先进栈的只能在栈底。

    2、栈的操作

    栈的插入操作,叫做进栈,也称压栈,入栈。

    栈的删除操作,也做出栈,也叫弹栈。

    3、栈的顺序存储结构及实现

    栈的顺序存储结构一般用数组实现,下标为0的一端为栈底比较好,因为首元素都存在栈底,变化最小。所以让它作为栈底。

    当栈存一个元素,top==0,因此通常把空栈的判定条件定为top=-1.

    4、栈的顺序结构中进栈操作及出栈操作代码如下

    public class Stack<E> {
       private ArrayList<E> list = new ArrayList<E>();
       private int size;
       /*
        * 进栈操作
        */
       public void push(E e){
           list.add(e);
           size++;
       }
       /*
        * 出站操作
        */
       public E pop(){
           E e = list.get(size-1);
           size--;
           return e;
       }
       public static void main(String args[]){
           Stack<Object> stack = new Stack<Object>();
           stack.push("lllll");
           stack.push("222222");
           for(int i=0;i<=stack.size;i++){
               System.out.println(stack.pop());
           }
           }
    }

    5、栈的链式存储结构实现

    package com.aclie.dataStructe4.stack;
    
    public class LinkStack {
    
    	Node1 top;//栈顶
    	Node1 cur;//栈顶后面一个结点
    	int count;
    	public void add(Object obj){
    		if(top == null){//空栈
    		top = new Node1(obj);//栈顶为新结点
    		top.next1 = cur;//修改栈顶的后继
    		count++;	
    		}else{
    			Node1 s =new Node1(obj);//要插入的新结点
    			s.next1 = top;//插入的结点的后继
    			cur = s.next1;//修改栈顶的后继
    			top = s;//栈顶结点
    			count++;
    		}
    	}
    	public void delete(Object obj){
    		if(top == null){
    			System.out.println("无删除 的结点,此表为控栈");
    		}
    		if(count == 1){
    			top = null;
    			System.out.println("现在为空栈");
    			count--;
    		}
    		if(count>=2){
    			top = cur;
    			cur = cur.next1;
    			count--;
    		}
    	}
    	public void print(Node1 node1){
    		if(node1 == null){
    			System.out.println("没有可打印的元素");
    		}else{
    			Node1 cur1 = node1;
    			while(cur1 != null){
    				System.out.println(cur1.data1);
    				cur1 = cur1.next1;
    			}
    		}
    	}
    	public static void main(String args[]){
    		LinkStack seqStack = new LinkStack();
    		seqStack.add("oooooo");
    		seqStack.print(seqStack.top);
    		seqStack.add("wwwww");
    		seqStack.add("eeeeee");
    		seqStack.delete(seqStack.top);
    		seqStack.print(seqStack.top);
    		}
    	
    }
    class Node1{
    	Object data1;
    	Node1 next1;
    	public Node1(Object d1){
    		this.data1 = d1;
    		
    	}
    }
    

      

  • 相关阅读:
    react特点和创建虚拟DOM
    vue的keep-alive
    JavaScript-事件委托
    vue-router参数传递
    js常用的字符串处理
    vue-vuex
    vue-组件
    vue-父子组件传值
    堆和栈
    js-深拷贝浅拷贝
  • 原文地址:https://www.cnblogs.com/snowwang/p/6074962.html
Copyright © 2020-2023  润新知