单链表实现栈

来源:互联网 发布:淘宝网上买电视可靠吗 编辑:程序博客网 时间:2024/06/08 13:22

编程实现下面的栈顶操作:

[cpp] view plaincopyprint?
  1. class MyData  
  2. {  
  3.       void push(data);  
  4.       void pop(&data);  
  5.       bool isEmpty();  
  6. };  
解析:显然这里需要实现栈的3种基本操作,即进栈、出栈以及判空。为了方便起见,使用单链表结构实现栈并且使用类的形式来定义站内及其节点。首先是节点类和栈类的具体定义,程序代码如下:

[cpp] view plaincopyprint?
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class MyData  
  5. {  
  6. public:  
  7.     MyData() : data(0), next(NULL){}      //默认构造函数  
  8.     MyData(int value) : data(value), next(NULL){}  //带参数的构造函数  
  9.     int data;               //数据域  
  10.     MyData *next;           //下一个节点  
  11. };  
  12.   
  13. class MyStack  
  14. {  
  15. public:  
  16.     MyStack() : top(NULL) {}    //默认构造函数  
  17.     void push(MyData data);     //进栈  
  18.     void pop(MyData *pData);    //出栈  
  19.     bool IsEmpty();             //是否为空  
  20.     MyData *top;                //栈顶  
  21. };  
        由于不能直接操作栈底,因此这里没有定义栈底的指针。在MyStack的默认够找函数中,把栈顶指针top置空,表示此时栈为空栈。

接下来是进栈、出栈以及判空的代码实现,程序代码如下:

[cpp] view plaincopyprint?
  1. void MyStack::push(MyData data)  
  2. {  
  3.     MyData *pData = NULL;  
  4.     pData = new MyData(data.data);  //生成新节点  
  5.     pData->next = top;               //与原来的栈顶节点相连  
  6.     top = pData;                    //栈顶节点为新加入的节点  
  7. }  
  8.   
  9. void MyStack::pop(MyData *data)  
  10. {  
  11.     if(IsEmpty())               //判空  
  12.     {  
  13.         return;  
  14.     }  
  15.     data->data = top->data;       //给传出的参数赋值  
  16.     MyData *p = top;            //临时保存原栈顶节点  
  17.     top = top->next;         //移动栈顶,指向下一个节点  
  18.     delete p;                   //释放原栈顶节点内存  
  19. }  
  20.   
  21. bool MyStack::IsEmpty()  
  22. {  
  23.     return (NULL == top);    //如果top为空返回1,否则返回0  
  24. }  
MyStack::push 函数表示进栈操作,它实际上就是在单链表的首部进行插入操作,并且top一直指向这个单链表的首部。

MyStack::pop 函数表示出栈操作,它实际上就是在单链表的首部进行删除操作,并且top一直指向这个单链表的首部,另外它还把删除节点的数据保存到data参数中。

MyStack::IsEmpty 函数非常简单,当栈空时,top指针为NULL,而当栈中有节点时,top指向链表头,因此只需要用top与NULL进行比较即可。

下面是栈操作的测试代码:

[cpp] view plaincopyprint?
  1. int main()  
  2. {  
  3.     MyData data(0);  
  4.     MyStack s;  
  5.     s.push(MyData(1));  //进栈  
  6.     s.push(MyData(2));  
  7.     s.push(MyData(3));  
  8.   
  9.     s.pop(&data);       //出栈  
  10.     cout<<"pop "<<data.data<<endl;  
  11.     s.pop(&data);  
  12.     cout<<"pop "<<data.data<<endl;  
  13.     s.pop(&data);  
  14.     cout<<"pop "<<data.data<<endl;  
  15.     cout<<"Empty = "<<s.IsEmpty()<<endl;  
  16.   
  17.     return 0;  
  18. }  

执行结果为:

[cpp] view plaincopyprint?
  1. pop 3  
  2. pop 2  
  3. pop 1  
  4. Empty = 1  
  5. Press any key to continue 
0 0
原创粉丝点击