forked from wangzheng0822/algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update java/08_stack/SampleBrowser.java
- Loading branch information
Showing
1 changed file
with
193 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
package algo.lesson08; | ||
|
||
/** | ||
* 使用前后栈实现浏览器的前进后退。 | ||
* | ||
* @author chinalwb | ||
*/ | ||
public class SampleBrowser { | ||
|
||
public static void main(String[] args) { | ||
SampleBrowser browser = new SampleBrowser(); | ||
browser.open("http://www.baidu.com"); | ||
browser.open("http://news.baidu.com/"); | ||
browser.open("http://news.baidu.com/ent"); | ||
browser.goBack(); | ||
browser.goBack(); | ||
browser.goForward(); | ||
browser.open("http://www.qq.com"); | ||
browser.goForward(); | ||
browser.goBack(); | ||
browser.goForward(); | ||
browser.goBack(); | ||
browser.goBack(); | ||
browser.goBack(); | ||
browser.goBack(); | ||
browser.checkCurrentPage(); | ||
} | ||
|
||
private String currentPage; | ||
private LinkedListBasedStack backStack; | ||
private LinkedListBasedStack forwardStack; | ||
|
||
public SampleBrowser() { | ||
this.backStack = new LinkedListBasedStack(); | ||
this.forwardStack = new LinkedListBasedStack(); | ||
} | ||
|
||
public void open(String url) { | ||
if (this.currentPage != null) { | ||
this.backStack.push(this.currentPage); | ||
this.forwardStack.clear(); | ||
} | ||
showUrl(url, "Open"); | ||
} | ||
|
||
public boolean canGoBack() { | ||
return this.backStack.size() > 0; | ||
} | ||
|
||
public boolean canGoForward() { | ||
return this.forwardStack.size() > 0; | ||
} | ||
|
||
public String goBack() { | ||
if (this.canGoBack()) { | ||
this.forwardStack.push(this.currentPage); | ||
String backUrl = this.backStack.pop(); | ||
showUrl(backUrl, "Back"); | ||
return backUrl; | ||
} | ||
|
||
System.out.println("* Cannot go back, no pages behind."); | ||
return null; | ||
} | ||
|
||
public String goForward() { | ||
if (this.canGoForward()) { | ||
this.backStack.push(this.currentPage); | ||
String forwardUrl = this.forwardStack.pop(); | ||
showUrl(forwardUrl, "Foward"); | ||
return forwardUrl; | ||
} | ||
|
||
System.out.println("** Cannot go forward, no pages ahead."); | ||
return null; | ||
} | ||
|
||
public void showUrl(String url, String prefix) { | ||
this.currentPage = url; | ||
System.out.println(prefix + " page == " + url); | ||
} | ||
|
||
public void checkCurrentPage() { | ||
System.out.println("Current page is: " + this.currentPage); | ||
} | ||
|
||
/** | ||
* A LinkedList based Stack implementation. | ||
*/ | ||
public static class LinkedListBasedStack { | ||
|
||
// public static void main(String[] args) { | ||
// LinkedListBasedStack stack = new LinkedListBasedStack(); | ||
// stack.push("A"); | ||
// stack.push("B"); | ||
// stack.push("C"); | ||
// stack.pop(); | ||
// stack.push("D"); | ||
// stack.push("E"); | ||
// stack.pop(); | ||
// stack.push("F"); | ||
// stack.print(); | ||
// | ||
//// String data = stack.getTopData(); | ||
//// System.out.println("Top data == " + data); | ||
// } | ||
|
||
private int size; | ||
private Node top; | ||
|
||
static Node createNode(String data, Node next) { | ||
return new Node(data, next); | ||
} | ||
|
||
public void clear() { | ||
this.top = null; | ||
this.size = 0; | ||
} | ||
|
||
public void push(String data) { | ||
Node node = createNode(data, this.top); | ||
this.top = node; | ||
this.size++; | ||
} | ||
|
||
public String pop() { | ||
Node popNode = this.top; | ||
if (popNode == null) { | ||
System.out.println("Stack is empty."); | ||
return null; | ||
} | ||
this.top = popNode.next; | ||
if (this.size > 0) { | ||
this.size--; | ||
} | ||
return popNode.data; | ||
} | ||
|
||
public String getTopData() { | ||
if (this.top == null) { | ||
return null; | ||
} | ||
return this.top.data; | ||
} | ||
|
||
public int size() { | ||
return this.size; | ||
} | ||
|
||
public void print() { | ||
System.out.println("Print stack:"); | ||
Node currentNode = this.top; | ||
while (currentNode != null) { | ||
String data = currentNode.getData(); | ||
System.out.print(data + "\t"); | ||
currentNode = currentNode.next; | ||
} | ||
System.out.println(); | ||
} | ||
|
||
public static class Node { | ||
|
||
private String data; | ||
private Node next; | ||
|
||
public Node(String data) { | ||
this(data, null); | ||
} | ||
|
||
public Node(String data, Node next) { | ||
this.data = data; | ||
this.next = next; | ||
} | ||
|
||
public void setData(String data) { | ||
this.data = data; | ||
} | ||
|
||
public String getData() { | ||
return this.data; | ||
} | ||
|
||
public void setNext(Node next) { | ||
this.next = next; | ||
} | ||
|
||
public Node getNext() { | ||
return this.next; | ||
} | ||
} | ||
|
||
} | ||
} |