#include <bits/stdc++.h>
using namespace std;
struct ChangeNode
{
string text;
ChangeNode* next;
ChangeNode* pre;
ChangeNode( string t)
{
text = t;
next = nullptr;
pre = nullptr;
}
} ;
class editor
{
private :
ChangeNode* current;
public :
//Khoi tao
editor( ) : current( new ChangeNode( "" ) ) { }
void type( const string & newText)
{
ChangeNode* newNode = new ChangeNode( newText) ;
newNode- > pre = current;
current- > next = newNode;
current = newNode;
cout << "Typed: " << newText << ". Current text: " << getText( ) << endl;
}
string undo( )
{
if ( current ! = nullptr && current- > pre ! = nullptr) {
current = current- > pre;
cout << "Undo. Current text: " << getText( ) << endl;
return current- > text;
} else {
cout << "Cannot undo further." << endl;
return getText( ) ;
}
}
string redo( )
{
if ( current ! = nullptr && current- > next ! = nullptr)
{
current = current- > next;
cout << "Redo. Current text: " << getText( ) << endl;
return current- > text;
}
else
{
cout << "Cannot redo further." << endl;
return getText( ) ;
}
}
string getText( ) const
{
return current- > text;
}
~editor( )
{
ChangeNode* temp;
while ( current ! = nullptr && current- > pre ! = nullptr)
{
current = current- > pre;
}
while ( current ! = nullptr)
{
temp = current;
current = current- > next;
delete temp;
}
}
} ;
int main( )
{
editor e;
e.type ( "Hello" ) ;
e.type ( " " ) ;
e.type ( "World" ) ;
e.undo ( ) ;
e.undo ( ) ;
e.redo ( ) ;
cout << "Final text: " << e.getText ( ) << endl;
return 0 ;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IENoYW5nZU5vZGUgCnsKICAgIHN0cmluZyB0ZXh0OwogICAgQ2hhbmdlTm9kZSogbmV4dDsKICAgIENoYW5nZU5vZGUqIHByZTsKICAgIENoYW5nZU5vZGUoc3RyaW5nIHQpCiAgICB7CiAgICAgICAgdGV4dCA9IHQ7CiAgICAgICAgbmV4dCA9IG51bGxwdHI7CiAgICAgICAgcHJlID0gbnVsbHB0cjsKICAgIH0KfTsKCmNsYXNzIGVkaXRvciAKewpwcml2YXRlOgogICAgQ2hhbmdlTm9kZSogY3VycmVudDsKCnB1YmxpYzoKICAgIC8vS2hvaSB0YW8KICAgIGVkaXRvcigpIDogY3VycmVudChuZXcgQ2hhbmdlTm9kZSgiIikpIHt9CgogICAgdm9pZCB0eXBlKGNvbnN0IHN0cmluZyAmbmV3VGV4dCkgCiAgICB7CiAgICAgICAgQ2hhbmdlTm9kZSogbmV3Tm9kZSA9IG5ldyBDaGFuZ2VOb2RlKG5ld1RleHQpOwogICAgICAgIG5ld05vZGUtPnByZSA9IGN1cnJlbnQ7CiAgICAgICAgY3VycmVudC0+bmV4dCA9IG5ld05vZGU7CiAgICAgICAgY3VycmVudCA9IG5ld05vZGU7CiAgICAgICAgY291dCA8PCAiVHlwZWQ6ICIgPDwgbmV3VGV4dCA8PCAiLiBDdXJyZW50IHRleHQ6ICIgPDwgZ2V0VGV4dCgpIDw8IGVuZGw7CiAgICB9CgogICAgc3RyaW5nIHVuZG8oKSAKICAgIHsKICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyICYmIGN1cnJlbnQtPnByZSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wcmU7CiAgICAgICAgICAgIGNvdXQgPDwgIlVuZG8uIEN1cnJlbnQgdGV4dDogIiA8PCBnZXRUZXh0KCkgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQtPnRleHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY291dCA8PCAiQ2Fubm90IHVuZG8gZnVydGhlci4iIDw8IGVuZGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KCk7CiAgICAgICAgfQogICAgfQoKICAgIHN0cmluZyByZWRvKCkgCiAgICB7CiAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0ciAmJiBjdXJyZW50LT5uZXh0ICE9IG51bGxwdHIpIAogICAgICAgIHsKICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CiAgICAgICAgICAgIGNvdXQgPDwgIlJlZG8uIEN1cnJlbnQgdGV4dDogIiA8PCBnZXRUZXh0KCkgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQtPnRleHQ7CiAgICAgICAgfSAKICAgICAgICBlbHNlIAogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAiQ2Fubm90IHJlZG8gZnVydGhlci4iIDw8IGVuZGw7CiAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KCk7CiAgICAgICAgfQogICAgfQoKICAgIHN0cmluZyBnZXRUZXh0KCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gY3VycmVudC0+dGV4dDsKICAgIH0KCiAgICB+ZWRpdG9yKCkgCiAgICB7CiAgICAgICAgQ2hhbmdlTm9kZSogdGVtcDsKICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxscHRyICYmIGN1cnJlbnQtPnByZSAhPSBudWxscHRyKSAKICAgICAgICB7CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wcmU7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChjdXJyZW50ICE9IG51bGxwdHIpIAogICAgICAgIHsKICAgICAgICAgICAgdGVtcCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgICAgICAgICBkZWxldGUgdGVtcDsKICAgICAgICB9CiAgICB9Cn07CgppbnQgbWFpbigpIAp7CiAgICBlZGl0b3IgZTsKICAgIGUudHlwZSgiSGVsbG8iKTsKICAgIGUudHlwZSgiICIpOwogICAgZS50eXBlKCJXb3JsZCIpOwoKICAgIGUudW5kbygpOwogICAgZS51bmRvKCk7CiAgICBlLnJlZG8oKTsKCiAgICBjb3V0IDw8ICJGaW5hbCB0ZXh0OiAiIDw8IGUuZ2V0VGV4dCgpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=