#include <string>
#include <iostream>
#include <stack>

using namespace std;



stack<char> g_stack;


class Context
{
public:
    void SetExpression(string sExpr) { m_sExpr = sExpr; }
    string GetExpression() const { return m_sExpr; }

private:
    string m_sExpr;
};


class Interpreter
{
public:
    virtual void Translate(const Context& context)=0;
};

class ConcreteInterpreterA : public Interpreter
{
public:
    void Translate(const Context& context);
};


class ConcreteInterpreterB : public Interpreter
{
public:
    void Translate(const Context& context);
};

void ConcreteInterpreterA::Translate(const Context& context)
{
    size_t len = context.GetExpression().size();
    
    if (len == 0 || len % 2 != 0)
    {
        cerr<<"TranslateA failed! mismatch brackets"<<endl;
    }
    else
    {
        cout<<"TranslateA go through!"<<endl;
    }
}

void ConcreteInterpreterB::Translate(const Context& context)
{
    while (!g_stack.empty()) g_stack.pop();
    
    string sExpression = context.GetExpression();
    for (unsigned int i = 0; i < sExpression.size(); i++)
    {
        if (sExpression[i] == '(') g_stack.push(sExpression[i]);
        else if (sExpression[i] == ')')
        {
            if (g_stack.size() == 0 || g_stack.top() != '(')
            {
                cerr<<"TranslateB failed! mismatch brackets"<<endl;
                return ;
            }
            else g_stack.pop();
        }
        else
        {
            cout<<"TranslateB failed! invalid character in expression"<<endl;
            return ;
        }
    }

    if (g_stack.size() != 0)
    {
        cerr<<"TranslateB failed! mismatch brackets"<<endl;
    }
    else
    {
        cout<<"TranslateB go through!"<<endl;
    }
}





int main(int argc, char *argv[])
{
    Interpreter* pInterpreterA = NULL, *pInterpreterB = NULL;
    Context context;
    

    pInterpreterA = new ConcreteInterpreterA;
    pInterpreterB = new ConcreteInterpreterB;

    context.SetExpression("");
    pInterpreterA->Translate(context);
    pInterpreterB->Translate(context);

    context.SetExpression("(()");
    pInterpreterA->Translate(context);
    pInterpreterB->Translate(context);

    context.SetExpression("(())");
    pInterpreterA->Translate(context);
    pInterpreterB->Translate(context);

    context.SetExpression("(())()");
    pInterpreterA->Translate(context);
    pInterpreterB->Translate(context); 

    delete pInterpreterA;
    delete pInterpreterB;
    
    
    return 0;
}

优质内容筛选与推荐>>
1、ThinkPHP---thinkphp完善站内信功能
2、原来这么简单就可以申请Blog了,害我还自己做了一个~
3、移动端网页 -- 安卓与IOS兼容
4、更改mysql中当前auto_increment的值的方法
5、sql中索引不会被用到的几种情况


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号