初识栈

刚接触栈通过一条题目对栈有了初步的见解。

首先栈是一个先进后出的线性表,就像一个容器一样,最先放入的东西在最底下,要想拿出来就得把上面的东西都拿掉。

栈顶 and 栈底  这个不用多想 ,很容易理解。

 

来一张图:

关于栈的几个方法:

  /**
     * 入栈
     * @param value
     */
    public void push(Object value){
        Node pushedNode = new Node(value);
        pushedNode.next = top;
        top = pushedNode;

        size++;
    }
  /**
     * 出栈
     */
    public Object pop() throws Exception {

        if(size == 0){
            throw new Exception("空栈异常");
        }

        Node popedNode = top;
        top = top.next;
        size --;

        return  popedNode.data;
    }
  /**
     * 返回栈顶元素
     */
    public Object peek() throws Exception {
        if(size == 0){
            throw new Exception("空栈异常");
        }

        return  top.data;
    }
 /**
     * 遍历栈
     */
    public void traverse(){
        Node temp = top;
        while (temp != null){
            System.out.println(""+temp.data);

            temp = temp.next;

        }
    }

以上栈的方法参考来自:https://www.jianshu.com/p/ce193a67ec3d

上题目:

public class 网页跳转 {

	static int n;

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
        Stack<String>  url = new Stack<String>();
        Stack<String>  url_out = new Stack<String>();
        for(int i = 0;i<n;i++)
        {
        	String s = sc.next();
        	if(s.equals("VISIT"))
        	{
        		String url_s = sc.next();
        		System.out.println(url_s);
        		url.push(url_s);
        		url_out.clear();//清空   栈顶指针从头开始,但栈中元素已经存在,而相对的销毁,就是栈内存释放,这个栈就死亡了
        	}
        	 if(s.equals("BACK")){
                 if(!url.isEmpty())
                     url_out.push(url.pop());
                 if(url.isEmpty()){
                     System.out.println("Ignore");
                     if(!url_out.isEmpty())//与下面的else配对
                         url.push(url_out.pop());
                 }else{
                     System.out.println(url.peek());
                
                 }    
                 
             }
             if(s.equals("FORWARD")){
                 if(url_out.isEmpty()){
                     System.out.println("Ignore");
                     
                 }else{
                     System.out.println(url_out.peek());
                     url.push(url_out.pop());
                 }
             }
         }
         sc.close();
        }
        
		
		
	}

 

使用两个栈,首先如果s等于VISIT就先让元素进url栈,判断s等于BACK,先看之前有没有输入让网址,没有,输出Ignore,为了判断之前是输入了一个网址还是多个网址,要将url栈中元素执行一次url_out.push(url.pop());执行完之后再判断url是否为空,为空说明url原本只有一个元素,无法执行BACK,只好返回ignore,还是不为空直接返回url中栈顶元素,执行url.peek();这时候如果url中只有一个元素拿到了url_out中,输出了ignore需要将url_out中的元素还给url,执行url.push(url_out.pop());

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值