這道題的題幹已經將這道題的解法解釋的很清楚了。維護兩個棧,一個forward棧和一個backward棧,然後就是各個命令對應的具體的操作。
首先起始階段是訪問:http://www.acm.org/
VISIT命令:將當前頁面壓入backward棧中,然後清空forward棧,然後將給出的url作為當前的訪問頁面。
BACK命令:如果backward棧不為空白,那麼將cur壓入forward棧中,然後將backward棧頂元素作為當前頁面;否則忽略該命令。
FORWARD命令:如果forward棧不為空白,那麼將cur壓入backw棧中,然後從forw的棧頂元素作為當前頁面;否則忽略該命令。
最後就是QUIT命令了。
按照上面方法,進行棧的維護就行了。
我的做法是直接自己先封裝了一個MyStack的類,然後提供了棧所應該具有的功能的介面,就這樣子用C++搞定了。下面可以看看My Code:
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>using namespace std;string op,cur;class MyStack{private: string st[150]; int top ;public: MyStack(); void Push(string x); string Top(); void Pop(); void Clear(); bool IsEmpty();};MyStack::MyStack(){ top = -1;}string MyStack::Top(){ return st[top];}void MyStack::Pop(){ top--;}void MyStack::Clear(){ top = -1;}bool MyStack::IsEmpty(){ if(top == -1) return true; else return false;}void MyStack::Push(string x){ st[++top] = x;}int main(){ //freopen("out.txt","w",stdout); MyStack forward,backward; cur = string("http://www.acm.org/"); while(1) { bool flag = true; cin>>op; if(op.compare("QUIT") == 0) break; else if(op.compare("VISIT") == 0) { string temp; cin>>temp; backward.Push(cur); forward.Clear(); cur = temp; } else if(op.compare("BACK") == 0) { if(!backward.IsEmpty()) { forward.Push(cur); cur = backward.Top(); backward.Pop(); } else { flag = false; cout<<"Ignored"<<endl; } } else if(op.compare("FORWARD") == 0) { if(!forward.IsEmpty()) { backward.Push(cur); cur = forward.Top(); forward.Pop(); } else { flag = false; cout<<"Ignored"<<endl; } } if(flag) cout<<cur<<endl; } return 0;}
另外我自己再寫了一個Java版本的棧的封裝,差不多的思路吧!學習Java的可以看看……
import java.util.*;import java.io.*;class MyStack{private String [] st = new String [150];private int top;public MyStack(){top = -1;}public void Pop(){top--;}public String Top(){return st[top];}public void Clear(){top = -1;}public void Push(String x){st[++top] = x;}public boolean IsEmpty(){if(top == -1)return true;elsereturn false;}}public class Main{public static void main(String [] args){MyStack backward = new MyStack();MyStack forward = new MyStack();Scanner cin = new Scanner(System.in);String cur = new String("http://www.acm.org/");String op;while(cin.hasNext()){boolean flag = true;op = cin.next();if(op.compareTo(new String("QUIT")) == 0)break;else if(op.compareTo(new String("VISIT")) == 0){String temp;temp = cin.next();backward.Push(cur);forward.Clear();cur = temp;}else if(op.compareTo(new String("BACK")) == 0){if(backward.IsEmpty() == true){flag = false;System.out.println("Ignored");}else{forward.Push(cur);cur = backward.Top();backward.Pop();}}else if(op.compareTo(new String("FORWARD")) == 0){if(forward.IsEmpty() == true){flag = false;System.out.println("Ignored");}else{backward.Push(cur);cur = forward.Top();forward.Pop();}}if(flag)System.out.println(cur);}}}