数据结构之堆栈stack

堆栈stack是一种后进先出的通过扩展Vector类而来的数据结构,即先放入的元素在逻辑上处于栈底,而后放入的元素位于栈顶。

常用方法为:push、pop、peek、empty、search等,下面分别列举这些方法:

Stack stack=new Stack();
		
		String ss1="sun";
		String ss2="moon";
		String ss3="star";
		stack.push(ss1);   //把元素压入堆栈
		stack.push(ss2);
		stack.push(ss3);
		System.out.println(stack);  //程序输出:[sun, moon, star]

		stack.pop();	//出栈
		System.out.println(stack);  //程序输出:[sun, moon]
		
		//方法返回栈顶元素,但不做出栈操作
		System.out.println(stack.peek());  //程序输出:moon 

		//方法用来判别堆栈是否为空,
		System.out.println(stack.empty());  //程序输出:false

		//方法返回查找对象的位置。从1开始
		System.out.println(stack.search(ss1)); //程序输出:2 

从jdk1.6的源码来看,stack是继承Vector类的:

public class Stack<E> extends Vector<E> {
    /**
     * Creates an empty Stack.
     */
    public Stack() {
    }
 
    /**
     * Pushes an item onto the top of this stack. This has exactly
     * the same effect as:
     * <blockquote><pre>
     * addElement(item)</pre></blockquote>
     *
     * @param   item   the item to be pushed onto this stack.
     * @return  the <code>item</code> argument.
     * @see     java.util.Vector#addElement
     */
    public E push(E item) {
	addElement(item);
 
	return item;
    }
 
    /**
     * Removes the object at the top of this stack and returns that
     * object as the value of this function.
     *
     * @return     The object at the top of this stack (the last item
     *             of the <tt>Vector</tt> object).
     * @exception  EmptyStackException  if this stack is empty.
     */
    public synchronized E pop() {
	E	obj;
	int	len = size();
 
	obj = peek();
	removeElementAt(len - 1);
 
	return obj;
    }
 
    /**
     * Looks at the object at the top of this stack without removing it
     * from the stack.
     *
     * @return     the object at the top of this stack (the last item
     *             of the <tt>Vector</tt> object).
     * @exception  EmptyStackException  if this stack is empty.
     */
    public synchronized E peek() {
	int	len = size();
 
	if (len == 0)
	    throw new EmptyStackException();
	return elementAt(len - 1);
    }
 
    /**
     * Tests if this stack is empty.
     *
     * @return  <code>true</code> if and only if this stack contains
     *          no items; <code>false</code> otherwise.
     */
    public boolean empty() {
	return size() == 0;
    }
 
    /**
     * Returns the 1-based position where an object is on this stack.
     * If the object <tt>o</tt> occurs as an item in this stack, this
     * method returns the distance from the top of the stack of the
     * occurrence nearest the top of the stack; the topmost item on the
     * stack is considered to be at distance <tt>1</tt>. The <tt>equals</tt>
     * method is used to compare <tt>o</tt> to the
     * items in this stack.
     *
     * @param   o   the desired object.
     * @return  the 1-based position from the top of the stack where
     *          the object is located; the return value <code>-1</code>
     *          indicates that the object is not on the stack.
     */
    public synchronized int search(Object o) {
	int i = lastIndexOf(o);
 
	if (i >= 0) {
	    return size() - i;
	}
	return -1;
    }
 
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1224463164541339165L;


细节方面:

1.pop与peek两种方法都返回的是栈顶元素,区别为pop做出栈动作,peek不做。
2.search返回的是与参数equal的与栈顶最近距离的元素与栈顶的距离。

列举各种方法:

package stack;

import java.util.List;
import java.util.Stack;

public class StackTest {
public static void main(String[] args) {
	Stack stack = new Stack();
	stack.push(1);//入栈
	
	System.out.println(stack.isEmpty());//false
	
	stack.pop();//出栈
	System.out.println(stack.isEmpty());//true
	
	stack.push(1);//入栈     int 类型
	stack.push(2l);//入栈     Long类型
	stack.push(3.0);//入栈   double类型
	System.out.println("栈中有: "+stack.size()+" 个元素 。");//栈中有: 3 个元素 。
	
	//栈中可以存放任何类型
	Person p = new Person("xiaoming",20);
	stack.push(p); //入栈  引用对象
	System.out.println("栈中有: "+stack.size()+" 个元素 。");//栈中有: 3 个元素 。
	//System.out.println(stack.get(4)); java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 4
	
	System.out.println(stack.get(3)); // Person [name=xiaoming, age=20]
	System.out.println(stack.peek()); // Person [name=xiaoming, age=20] 取栈顶值(不出栈)
	
	System.out.println(stack.contains(2));//false
	System.out.println(stack.contains(2l));//true
	
	stack.add(2, p); //入栈
	System.out.println(stack.get(2));//Person [name=xiaoming, age=20]
	System.out.println(stack.size());
	
	System.out.println(stack.capacity());// 10
	
	System.out.println(stack.empty());//false 判空
	System.out.println("栈中有: "+stack.size()+" 个元素 。");//栈中有: 5 个元素 。
	
	Stack stack1 = (Stack) stack.clone();//克隆一个栈结构
	System.out.println("克隆的stack1栈中有: "+stack.size()+" 个元素 。");//克隆的stack1栈中有: 5 个元素 。
	System.out.println(stack.equals(stack1));//true
	
	stack.push("你好");
	System.out.println(stack.equals(stack1));//false
	
	System.out.println(stack.elements().toString());//java.util.Vector$1@7852e922
	
	System.out.println("p元素的下标是:"+stack.indexOf(p));//p元素的下标是:2
	
	//stack.forEach();
	
	System.out.println(stack.firstElement());//获取栈底元素
	System.out.println(stack.lastElement());//获取栈顶元素
	
	//stack.insertElementAt(1, "hh");
	//stack.notify();有关线程的操作      Exception in thread "main" java.lang.IllegalMonitorStateException
	
	System.out.println("删除之前有"+stack.size()+"个元素"); //删除之前有6个元素
	stack.remove(3);//删除一个元素
	System.out.println("删除一个元素有"+stack.size()+"个元素");//删除之前有5个元素
	
	System.out.println("之前stack1中有"+stack1.size()+"个元素");
	//stack.removeAll(stack1);
	stack1.removeAll(stack1);  //之前stack1中有5个元素     奇怪的用法!!!!!
	System.out.println("removeAll之后,stack1中有"+stack1.size()+"个元素");//removeAll之后,stack1中有0个元素
	
	System.out.println("改变之前,下表为2的元素值为:"+stack.get(2));//改变之前,下表为2的元素值为:Person [name=xiaoming, age=20]
	stack.set(2, "改变下标为2的元素");
	System.out.println("改变之后,下表为2的元素值为:"+stack.get(2));//改变之后,下表为2的元素值为:改变下标为2的元素
	
	Object[] stackList = stack.toArray();
	for(int i =0;i<stack.size();i++) {
		System.out.print(stackList[i]+",");
	}
	//1,2,改变下标为2的元素,Person [name=xiaoming, age=20],你好,
	
	}
}

参考:
https://blog.csdn.net/a19881029/article/details/9408649
https://blog.csdn.net/IBLiplus/article/details/82505505

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值