飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5874|回复: 4

栈的基本操作的实现——C++类封装

[复制链接]

该用户从未签到

发表于 2011-2-7 10:46:27 | 显示全部楼层 |阅读模式
本帖最后由 Knuth学徒 于 2011-2-7 11:03 编辑

线性表主要是栈和队列,一般情况下用STL库来模拟就可以了,但是STL的实现方式我觉得有必要研究下。

       这里先讨论下简单的栈 stack的实现.

       一般栈有一下几种操作: push , pop , top , empty , size

      这里我之所以介绍栈,是为了之后构想的 算法三部曲 做铺垫,不然跳跃度太大很唐突。。。。

      我的写法用了模板,可以适应各种结构。

      头文件: stack.h:
  1.      template<class type>
  2.       class  stack{
  3.               private:
  4.                        type  val[MAX];
  5.                        int  cnt;
  6.                        int point;
  7.              public:
  8.                        stack();   //构造函数
  9.                        ~stack(); //析构函数
  10.                        void push(type data);    //压栈操作
  11.                        void pop();        //出栈操作
  12.                        type top();       //取栈顶元素
  13.                        bool empty();
  14.                        int size();
  15.        }
复制代码
实现文件: stack.cpp
  1.        template<class type>
  2.        /////////////////////////////////////////////////////////////////////
  3.        //          函数名:stack()
  4.        //          参数:None
  5.        //          前提:None
  6.        //          描述:None
  7.        //          用法:None
  8.        /////////////////////////////////////////////////////////////////////
  9.        stack<type>:: stack(){
  10.                  cnt = 0;
  11.                  point = 0;
  12.                  memset(val , 0 , sizeof(val));
  13.        }
  14.        template<class type>
  15.        /////////////////////////////////////////////////////////////////////
  16.        //          函数名:push()
  17.        //          参数:data
  18.        //          前提:栈未满
  19.        //          描述:将元素压入栈
  20.        //          用法:对象名. push( xx );
  21.        /////////////////////////////////////////////////////////////////////
  22.        void  stack<type>::push( type  data)
  23.        {
  24.                 point ++;
  25.                 val [point] = data;
  26.                 cnt ++;
  27.        }
  28.       
  29.        template<class type>
  30.        /////////////////////////////////////////////////////////////////////
  31.        //          函数名:pop()
  32.        //          参数:None
  33.        //          前提:栈非空
  34.        //          描述:将栈顶元素弹出
  35.        //          用法:对象名. pop( );
  36.        /////////////////////////////////////////////////////////////////////
  37.        void stack<type>::pop(){
  38.                  point --;
  39.                  cnt --;
  40.        }

  41.        template<class type>
  42.        /////////////////////////////////////////////////////////////////////
  43.        //          函数名:top()
  44.        //          参数:None
  45.        //          前提:栈非空
  46.        //          描述:将栈顶元素读出
  47.        //          用法:对象名. top( );
  48.        /////////////////////////////////////////////////////////////////////
  49.        type stack<type>:: top()
  50.        {
  51.                  return val[point];
  52.        }

  53.        template<class type>
  54.        /////////////////////////////////////////////////////////////////////
  55.        //          函数名:empty()
  56.        //          参数:None
  57.        //          前提:None
  58.        //          描述:判断栈是否为空
  59.        //          用法:对象名. empty();
  60.        /////////////////////////////////////////////////////////////////////
  61.        bool stack<type>:: empty()
  62.        {
  63.                   return (cnt == 0);
  64.        }

  65.        template<class type>
  66.        /////////////////////////////////////////////////////////////////////
  67.        //          函数名:size()
  68.        //          参数:None
  69.        //          前提:None
  70.        //          描述:返回栈的大小
  71.        //          用法:对象名.size();
  72.        /////////////////////////////////////////////////////////////////////
  73.        int stack<type>:: size()
  74.        {
  75.                    return cnt;
  76.        }
复制代码
///////////////////////////////////////////////// End  ////////////////////////////////////////////


    我的写法和STL的写法相类似,只是功能没有那么多,用法和STL库也一样。

    声明方法:   stack<类型> 对象名;
   

    栈的实现有了介绍之后,接下去会是队列,等到队列和栈的操作都写好后,就能发 算法的三部曲了——包括深度优先搜索、广度优先搜索、图算法等
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2011-2-7 11:08:20 | 显示全部楼层
自己先顶一个。
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2011-2-7 11:08:37 | 显示全部楼层
本帖最后由 Knuth学徒 于 2011-2-7 11:09 编辑

栈的应用非常广泛,必须要学会基本写法,这样才能够有深刻的理解
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2011-2-11 19:10:36 | 显示全部楼层
    学习了,楼主加油!
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2011-2-11 19:12:28 | 显示全部楼层
    回复 4# whypro


        谢谢关注,一起努力!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表