zoukankan      html  css  js  c++  java
  • C++数据结构之Linked Stack(链式栈)

    上一节用连续的方式实现栈,这种方法用一个确定大小的数组存储栈元素,因为当存储达到数组上限时会遇到麻烦。

    连续实现的栈与链式实现的栈的最大不同在于,前者使用一个确定大小的数组存储每一个栈元素,后者使用带指针的自定义结构(Node)来存储栈元素,因此可以在后期持续增加栈元素。

    链式栈的栈元素存储于自定义的数据结构--Node中,每一个Node均包含两个属性,一个是它里面的元素(栈元素),一个是指向它下一个Node的指针。由此,一个Node包含着栈元素,同时它指向着下一个Node,以此类推,构成一种链式实现的栈。最后,要用顶部指针(指向第一个Node的指针)作为该栈的寻址头。

    另外,在这个链式栈的实现当中还实现了几个有用的成员函数--析构函数与重载赋值运算。


    代码:

    Node.h文件:

    /*
     * Node.h
     *
     *  Created on: 2015年8月27日
     *      Author: Lv_Lang
     */
    
    #ifndef NODE_H_
    #define NODE_H_
    
    #include "stdio.h"
    
    typedef int Stack_entry;
    typedef Stack_entry Node_entry;
    
    struct Node
    {
    	//	data members
    	Node_entry entry; // 存放的元素
    	Node *next;		  // 指向下一个元素的指针
    	//	Constructors
    	Node();
    	Node(Node_entry item, Node *add_on = NULL);
    };
    
    
    
    #endif /* NODE_H_ */
    

    Node.cpp文件:

    /*
     * Node.cpp
     *
     *  Created on: 2015年8月27日
     *      Author: Lv_Lang
     */
    
    #include "Node.h"
    
    Node::Node()
    {
    	next = NULL;
    }
    Node::Node(Node_entry item, Node *add_on)
    {
    	entry = item;
    	next = add_on;
    }
    

    Stack.h文件:

    /*
     * Stack
     *
     *  Created on: 2015年8月21日
     *      Author: Administrator
     */
    
    #ifndef STACK
    #define STACK
    
    #include "Node.h"
    
    const int maxstack = 10;
    enum Error_code {overflow, underflow, success};
    
    class Stack
    {
    public:
    	Stack();
    	bool empty()const;
    	Error_code pop();
    	Error_code top(Stack_entry &item)const;//察看顶部元素,item作为取出值的载体
    	Error_code push(const Stack_entry &item);// item是放入的值
    	// Safety features for linked structures
    	~Stack();
    	Stack(const Stack &original);
    	void operator = (const Stack &original);
    protected:
    	Node *top_node;
    };
    
    
    
    #endif /* STACK_ */
    

    Stack.cpp文件:

    /*
     * Stack.cpp
     *
     *  Created on: 2015年8月21日
     *      Author: Administrator
     */
    #include "Stack.h"
    
    Stack::Stack()
    {
    	top_node = NULL;
    }
    bool Stack::empty()const
    {
    	if(top_node == NULL)
    		return true;
    	else
    		return false;
    }
    Error_code Stack::pop()
    {
    	if(empty())
    			return underflow;
    	else
    	{
    		//只需新建一个指针,无须新建空间故不用new
    		Node *old_top = top_node;
    		top_node = old_top->next;
    		delete old_top; //记得要delete掉被删除指针指向的空间
    		return success;
    	}
    }
    Error_code Stack::top(Stack_entry &item)const
    {
    	if(empty())
    		return underflow;
    	else
    		item = top_node->entry;
    	return success;
    }
    Error_code Stack::push(const Stack_entry &item)
    {
    	//需要先new出一块区域
    	Node *new_top = new Node(item,top_node); //new语句返回的是指针
    	if(new_top== NULL)
    		return overflow;
    	else
    	{
    		top_node = new_top;
    		return success;
    	}
    }
    Stack::~Stack()
    {
    	while(!empty())
    	{
    		pop();
    	}
    }
    void Stack::operator =(const Stack &original)
    {
    	Node *new_top, *new_copy, *original_node = original.top_node;
    	if(original.top_node == NULL)
    		new_top = NULL;
    	else
    	{
    		new_top = new_copy = new Node(original_node->entry);
    		while(original_node->next != NULL)
    		{
    			original_node = original_node->next;
    			new_copy->next = new Node(original_node->entry);
    			new_copy = new_copy->next;
    		}
    	}
    	while(!empty())	//Clean out old Stack entries
    		pop();
    	top_node = new_top;	// and replace them with new entries
    }
    Stack::Stack(const Stack &original)
    {
    	Node *new_copy, *original_node = original.top_node;
    	if(original.top_node == NULL)
    		top_node = NULL;
    	else
    	{			// Duplicate(copy) the linked nodes
    		top_node = new_copy = new Node(original_node->entry);
    		while(original_node->next != NULL)
    		{
    			original_node = original_node->next;
    			new_copy->next = new Node(original_node->entry);
    			new_copy = new_copy->next;
    		}
    	}
    }
    
    

    main函数测试文件:

    /*
     * main.cpp
     *
     *  Created on: 2015年8月21日
     *      Author: Administrator
     */
    #include "Stack.h"
    //using
    
    void test_1();
    void test_2();
    
    int main()
    {
    	Stack mystack;
    	bool e = mystack.empty();
    	mystack.push(2);
    	e = mystack.empty();
    	mystack.push(5);
    	int a;
    	mystack.top(a);
    	printf("%s %d
    ","Hello",a);
    
    	Stack stack_1(mystack);
    	int b;
    	stack_1.top(b);
    	printf("%s %d
    ","Hello1",b);
    
    	Stack stack_2;
    	stack_2 = mystack;
    	int c;
    	stack_2.top(c);
    	printf("%s %d
    ","Hello2",c);
    
    	return 0;
    }
    
    
    

    main函数测试文件写的比较粗糙,这里只要测试能成功实现栈的重载赋值操作即可。


  • 相关阅读:
    jquery动画效果---animate()--滚屏
    一个前端的自我修养
    开发和测试
    jquery.find()
    c99和c++11的差异之一
    容器经典图
    C/C++中的##用法
    【心学.悟道】千圣皆过影,良知乃吾师
    memcpy, memset代码改写的方式
    三大软件原则
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586520.html
Copyright © 2011-2022 走看看