首页 > 其他 > 详细

每日一题18:栈

时间:2015-04-09 08:47:47      阅读:96      评论:0      收藏:0      [点我收藏+]

用C++写了一个栈模板,其间用了一些《Effective C++》的准则,记录在这里喽。这个类还没有做到异常安全,以后改进!
Stack.h文件。

#ifndef _STACK_H_
#define _STACK_H_

namespace MyDataStructure
{
    template <typename T>
    class Stack
    {
    private:
        int Capacity;
        int Top;
        T* Vals;

        bool null()
        {
            return Capacity == 0;
        }
        void init(int capacity)
        {
            Capacity = capacity;
            Top = 0;
            Vals = new T[capacity];
        }
        void copy(const Stack& s)
        {
            Capacity = s.Capacity;
            Top = s.Top;
            Vals = NULL;
            if(s.Capacity != 0)
            {
                Vals = new T[Capacity];
                memcpy(Vals,s.Vals,Capacity*sizeof(T));
            }
        }

        void destroy()
        {
            if(Vals != NULL) delete []Vals;
            Top = 0;
            Capacity = 0;
        }
    public:
        Stack() : Capacity(0),Top(0),Vals(NULL){};
        Stack(int capacity)
            :Capacity(capacity),Top(0)
        {
            Vals = new T[capacity];
        }
        Stack(const Stack& s)
        {
            copy(s);
        }
        Stack& operator = (const Stack& s)
        {
            if(this == &s) return *this;
            destroy();
            copy(s);
            return *this;
        }
        ~Stack()
        {
            destroy();
        }
        bool resize(int capacity)
        {
            if(capacity <= 0) return false;
            if(capacity == Capacity) return true;
            if(!null())
            {

                T* vals = new T[capacity];
                if(capacity >= Top)
                {
                    memcpy(vals,Vals,Top*sizeof(T));
                }
                else
                {
                    memcpy(vals,Vals,capacity*sizeof(T));
                    Top = capacity;
                }
                Capacity = capacity;
                delete []Vals;
                Vals = vals;
            }
            else
                init(capacity);
            return true;
        }
        bool push(T val)
        {
            if(!full() && !null())
            {
                Vals[Top++] = val;
                return true;
            }
            return false;
        }
        bool pop(T& val)
        {
            if(!null() && !empty())
            {
                val = Vals[--Top];
                return true;
            }
            return false;
        }
        bool top(T &val)
        {
            if(!null() && !empty())
            {
                val = Vals[Top - 1];
                return true;
            }
            return false;
        }
        void clear()
        {
            Top = 0;
        }
        void size()
        {
            return Top;
        }
        bool empty()
        {
            return Top == 0;
        }
        bool full()
        {
            return Top == Capacity;
        }

    };

}
#endif 

下面是测试函数:
StackTest.cpp

// StackTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Stack.h"
#include <iostream>

using namespace MyDataStructure;
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    Stack<int> s1(10);
    for (int i = 1; i < 11; ++i)
    {
        s1.push(i);
    }

    Stack<int> s2(s1);
    s1.resize(20);
    for (int i = 1; i < 11; ++i)
    {
        int val;
        if(s1.pop(val))
        {
            cout<<val<<‘ ‘;
        }
    }
    cout<<endl;

    for (int i = 1; i < 11; ++i)
    {
        int val;
        if(s2.pop(val))
        {
            cout<<val<<‘ ‘;
        }
    }
    cout<<endl;
    return 0;
}

每日一题18:栈

原文:http://blog.csdn.net/liao_jian/article/details/44954693

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!