“大叔,我知道栈是什么东西!”王小明这次是有备而来的。
“哦,是什么东西?”
“栈是种数据结构,简单说就是一个数组,但是这个数组只能从尾部插入和取出。”
“嗯,没错。”大叔放下手头上的工作,“那你知道怎么实现吗?”
“当然啦,a piece of cake。”小明刷刷刷就想开始写了,大叔说,“诶,别着急。”
“你还记得学过的vector吗,知道是怎么删除元素的吗?”大叔又提起了vector。
“嗯,还记得,用push_back加入一个元素,用pop_back可以从后面删除一个元素。”
“那你试试用vector实现栈。”
“这么看来,好像有点思路,等等。”小明这才兴高采烈地开始写。
1 vector<int> stack; 2 int i; 3 for (i=0; i<10; i++) 4 { 5 stack.push_back(i); 6 } 7 for (i=0; i<5; i++) 8 { 9 stack.pop_back(); 10 }
“你看这样对不对?”小明好不高兴。
“嗯,还行,不过好像少了点什么……”大叔摸摸胡子。
“呃……”
“怎么取数据?”
“对了,看这!”小明又刷刷刷写了一句。
1 int top = stack[stack.size()-1]; 2 stack.pop_back();
“取完最后一个元素就把它删了!”
“嗯,是这样。你试试把它封装起来。”大叔看着那份代码。
“封装?”
“嗯,封装就是指把细节都隐藏起来,别人用你的方法不用关心你是怎么实现的,只需要知道怎么用。”
小明虽然上课的时候听说过这个概念,但是要自己来实现却不好说了。他焦急地挠着头。
”不懂吗?“
”不是不懂……要不大叔,你帮我写吧……“小明有点不好意思。
”那好,我就教教你,下次就要你自己写了。“说着大叔抽出一张草稿纸,飞快地写起来。
1 #include <vector> 2 using namespace std; 3 4 class Stack 5 { 6 public: 7 void clear() 8 { 9 _stack.clear(); 10 } 11 void push(int value) 12 { 13 _stack.push_back(value); 14 } 15 void pop() 16 { 17 _stack.pop_back(); 18 } 19 int top() 20 { 21 int top = _stack[_stack.size()-1]; 22 pop(); 23 return top; 24 } 25 protected: 26 vector<int> _stack; 27 };
“你看,我应该怎么调用它呢?”
“哇,这样要调用很容易啊!”
1 Stack stack; 2 stack.clear(); 3 int i; 4 for (i=0; i<10; i++) 5 { 6 stack.push(i);//插入数据 7 } 8 cout<<stack.top()<<endl;//取数据 9 for (i=0; i<5; i++) 10 { 11 stack.pop();//弹出数据 12 } 13 cout<<stack.top()<<endl;
“你看,简单吧?封装之后你只看到了需要的东西,什么数据结构,你都不需要去知道了,使用也很方便。”
“嗯,确实啊,以后我也要多封装!好像很厉害的样子!”小明高兴过头了。
“不过,这只是一个简单的写法,里面还有很多需要补充的,比如我们要判断这个栈是否为空,能否取数据等,你快点回去把它补充完整吧。”
“嗯,我马上就去!”小明高兴的就想走了,“大叔,你教我这么多,晚上我请你吃饭吧!”
大叔一副惊讶的样子,“好啊,去哪里吃饭呢?”
“今天晚上来我家,有丰富的饭菜哦!”
“呵呵,我肯定去!”
说完,王小明就蹦回家去了。