POJ 1028 Web Navigation(面向对象栈的封装)

       这道题的题干已经将这道题的解法解释的很清楚了。维护两个栈,一个forward栈和一个backward栈,然后就是各个命令对应的具体的操作。

首先起始阶段是访问:http://www.acm.org/ 

VISIT命令:将当前页面压入backward栈中,然后清空forward栈,然后将给出的url作为当前的访问页面。

BACK命令:如果backward栈不为空,那么将cur压入forward栈中,然后将backward栈顶元素作为当前页面;否则忽略该命令。

FORWARD命令:如果forward栈不为空,那么将cur压入backw栈中,然后从forw的栈顶元素作为当前页面;否则忽略该命令。

最后就是QUIT命令了。

按照上面方法,进行栈的维护就行了。

我的做法是直接自己先封装了一个MyStack的类,然后提供了栈所应该具有的功能的接口,就这样子用C++搞定了。下面可以看看我的代码:

#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;
		else
			return 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);
		}
	}
}



你可能感兴趣的:(java,Web,String,Class,import,stdstring)