王小明学STL3

  “大叔,我知道栈是什么东西!”王小明这次是有备而来的。

  “哦,是什么东西?”

  “栈是种数据结构,简单说就是一个数组,但是这个数组只能从尾部插入和取出。”

  “嗯,没错。”大叔放下手头上的工作,“那你知道怎么实现吗?”

  “当然啦,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;

  “你看,简单吧?封装之后你只看到了需要的东西,什么数据结构,你都不需要去知道了,使用也很方便。”

  “嗯,确实啊,以后我也要多封装!好像很厉害的样子!”小明高兴过头了。

  “不过,这只是一个简单的写法,里面还有很多需要补充的,比如我们要判断这个栈是否为空,能否取数据等,你快点回去把它补充完整吧。”

  “嗯,我马上就去!”小明高兴的就想走了,“大叔,你教我这么多,晚上我请你吃饭吧!”

  大叔一副惊讶的样子,“好啊,去哪里吃饭呢?”

  “今天晚上来我家,有丰富的饭菜哦!”

  “呵呵,我肯定去!”

  说完,王小明就蹦回家去了。

 

你可能感兴趣的:(STL)