回答

[id:lethevert:20070113:p1]
とりあえず、特にひねりもなく。

#include <iostream>

using namespace std;

class CharStack
 {
 private:
   char *a, *i;
 public:
   CharStack(int size)
    { i = a = new char[size];}
   ~CharStack()
    { delete[] a;}
   void push(char c)
    { *(i++) = c;}
   char pop()
    { return (i==a)?0:*(--i);}
   char top()
    { return (i==a)?0:*(i-1);}
 };

class CharQueue
 {
 private:
   const char *a;
 public:
   CharQueue(const char *s)
    { a = s;}
   char get()
    { return *(a++);}
 };

bool solve(CharQueue &source, CharQueue &problem, CharStack &stack)
 {
   char check = problem.get();
   //if end
   if (!check) return !stack.pop();
   //check stack
   if (stack.top() == check)
    { stack.pop();
      cout << "*";
      return solve(source, problem, stack);
    }
   //read source
   char in;
   while (in = source.get())
    { cout << in;
      stack.push(in);
      if (check == in)
       { stack.pop();
         cout << "*";
         return solve(source, problem, stack);
    }  }
   //fail
   return false;
 }

int main (int argc, char **argv)
 {
   const char *input = (argc>1)?argv[1]:"EASY";
   CharQueue source("EASY"), problem(input);
   CharStack stack(4);
   bool b = solve(source, problem, stack);
   cout << endl << (b?"OK":"NG");
 }