11#include < iostream>
22#include < stdexcept>
3+ #include < sstream>
34class Stack {
45 private:
56 enum Mode{write = 1 ,read = 2 ,undo = 3 ,redo = 4 ,unknown = 5 };
@@ -26,6 +27,7 @@ class Stack{
2627 }
2728 ~Stack (){
2829 delete[] arr;
30+ delete[] temp;
2931 }
3032 public:
3133 Mode classifyInput (const std::string& text){
@@ -47,62 +49,168 @@ class Stack{
4749 }
4850 return false ;
4951 }
50- std::string get_operation (const std::string& text){
51- std::string ans = " " ;
52- Mode m = classifyInput (text);
53- if (m == read){
54- return " read" ;
55- }else if (m == write){
56- return " write" ;
57- }else if (m == undo){
58- return " undo" ;
59- }else if (m == redo){
60- return " redo" ;
61- }
62- return " " ;
63- }
6452 bool is_empty ()const noexcept {
6553 if (size == 0 ){
6654 return true ;
6755 }
6856 return false ;
6957 }
58+ bool temp_is_empty ()const noexcept {
59+ if (temp_size == 0 ){
60+ return true ;
61+ }
62+ return false ;
63+ }
7064 std::string top (){
71- return arr[size];
65+ return arr[size - 1 ];
7266 }
73- private:
67+ std::string top_temp (){
68+ return temp[temp_size - 1 ];
69+ }
70+ private:
71+ /* *
72+ * @brief fungsi untuk mendapatkan operasi dengan melakukan parser
73+ * terhadap string dengan memisahkan keyword operasi dengan string utama
74+ *
75+ * @param text adalah string input yang masih mentah dalam kata lain masih
76+ * tercampur dengan keyword(write,read,undo,dan redo)
77+ *
78+ * @return string yang berisi operasi apa saja pada sebuah string
79+ */
80+ std::string get_operation (const std::string& text){
81+ std::string ans = " " ;
82+ std::istringstream iss (text);
83+ std::string cmd;
84+ iss >> cmd;
85+ Mode m = classifyInput (cmd);
86+ return cmd;
87+ }
88+ /* *
89+ * @brief fungsi untuk melakukan parser terhadap string,dengan kata
90+ * lain memisahkan keyword(write,read,undo,dan redo) dengan string utama
91+ *
92+ * @param text adalah string input yang masih mentah dalam kata lain masih
93+ * tercampur dengan keyword(write,read,undo,dan redo)
94+ *
95+ * @return sebuah string setelah di parser
96+ *
97+ * @details memakai istringstream untuk memisahkan keyword dengan string utama
98+ * parameter istringstream(is,str)
99+ * is: objek input stream
100+ * - std::cin(baca dari console)
101+ * - std::ifstream(baca dari file)
102+ * - std::istringstream(baca dari stream) ->kita memakai ini
103+ */
104+ std::string parser (const std::string& text){
105+ std::istringstream iss (text);
106+ std::string cmd;
107+ iss >> cmd; // ambil kata pertama(keyword)
108+ std::string args;
109+ std::getline (iss,args);
110+ if (!args.empty () && args.front () == ' ' ){ // jika ada spasi maka erase
111+ args.erase (0 ,1 );
112+ }
113+ return args;
114+ }
115+ private: // abstraksi common operation on stack
116+ void push_arr (const std::string& text){
117+ std::string parser_text = parser (text);
118+ arr[size] = parser_text;
119+ size++;
120+ }
121+ void push_temp (){
122+ temp[temp_size] = top ();
123+ temp_size++;
124+ }
125+ void pop_arr (){
126+ arr[size - 1 ] = " " ;
127+ size--;
128+ }
129+ void pop_temp (){
130+ temp[temp_size] = " " ;
131+ temp_size--;
132+ }
133+ public:
74134 void Write (const std::string& text){
75135 if (is_full ()){
76136 throw std::runtime_error (" Stack telah penuh" );
77137 }
78- Mode m = classifyInput (top ());
79- if (m == read){
80- arr[size] = text;
81- size++;
138+ Mode m = classifyInput (text);
139+ if (m == write){
140+ push_arr (text);
82141 }else {
83142 std::string operasi = get_operation (text);
84- if (!operasi.empty ()){
85- std::cout << " Tidak dapat melakukan operasi" << operasi << std::endl;
86- }else {
87- std::cout << " Keyword tidak ditemukan" << std::endl;
88- }
143+ std::cout << " Error: " << operasi << " not available" << std::endl;
89144 }
90145 }
91- void pop (){
146+ /* *
147+ * @brief undo adalah salah satu operasi pada text editor,adapun tugas nya adalah
148+ * membatalkan perubahan yang user lakukan.
149+ *
150+ * @details cara kerja undo:
151+ * 1.push top pada arr ke temp_stack
152+ * 2.pop element top pada arr
153+ */
154+ void Undo (const std::string& text){
92155 Mode m = classifyInput (top ());
93156 if (m == undo){
94- temp[temp_size] = top ();
95- temp_size++;
96- arr[size - 1 ] = " " ;
97- size--;
157+ if (is_empty ()){
158+ std::runtime_error (" Queue is empty" );
159+ }else {
160+ push_temp ();
161+ pop_arr ();
162+ }
163+ }else {
164+ std::string operasi = get_operation (top ());
98165 }
99166 }
100- public:
101- void menu (){
102-
167+ void Redo (){
168+ if (temp_is_empty ()){
169+ throw std::runtime_error (" tidak ada perubahan terbaru" );
170+ }else {
171+ arr[size] = top_temp ();
172+ size++;
173+ pop_temp ();
174+ }
175+ }
176+ void Read (){
177+ for (size_t i = 0 ;i < size;i++){
178+ std::cout << arr[i] << " " ;
179+ }
180+ std::cout << std::endl;
103181 }
182+ public:
183+ std::string input (){
184+ std::string text;
185+ std::cin >> text;
186+ return text;
187+ }
188+ void menu (const std::string& text){
189+ std::string operation = get_operation (text);
190+ Mode m = classifyInput (text);
191+ if (m == write){
192+ Write (text);
193+ }else if (m == read){
194+ Read ();
195+ }else if (m == undo){
196+ Undo (text);
197+ }else if (m == redo){
198+ Redo ();
199+ }else {
200+ std::string operasi = get_operation (top ());
201+ std::cout << " Error: " << operasi << " not available" << std::endl;
202+ }
203+ }
104204};
105205int main (){
206+ Stack stack1 (1024 ); //
207+ stack1.Write (" write aku" );
208+ stack1.Write (" write dia" );
209+ stack1.Write (" write sayang" );
210+ stack1.Write (" write kamu" );
211+ stack1.Read (); // aku dia sayang kamu
212+ stack1.Undo (" undo" ); // aku dia sayang
213+ stack1.Read ();
106214 std::cin.get ();
107215 return 0 ;
108216}
0 commit comments