刚接触栈通过一条题目对栈有了初步的见解。
首先栈是一个先进后出的线性表,就像一个容器一样,最先放入的东西在最底下,要想拿出来就得把上面的东西都拿掉。
栈顶 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());