基于Vector实现C++中的适配器stack(顺序栈)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ChaseRaod/article/details/71076598

前面我们讲过用模板实现顺序表的代码实现
模板顺序表
而实际应用中,我们常需要将一种接口转换为用户所需要的另一种接口,这就要用到C++中的适配器,对原本的程序进行一层包装。栈就是其中的一种。
这里写图片描述
栈遵循后进先出的规则,其插入和删除都是在栈顶操作,是一种特殊的线性顺序表,因此,实现栈我们通常建立在顺序表的基础上。srack不允许遍历,也不提供迭代器。
下面是栈的代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<string>
using namespace std;

template<class T>
class Vector
{
public:
    Vector()
        :_a(NULL)
        , _size()
        , _capacity(){}

    ~Vector()
    {
        if (_a)
        {
            delete [] _a;
            _a = NULL;
            _size = 0;
            _capacity = 0;
        }
    }

    void PushBack(const T& x)
    {
        Checkcapacity();
        _a[_size] = x;
        _size++;
    }


    void  PopBack()
    {
        _size--;
    }

    void PopFront()
    {
        for (size_t i = 0; i < _size; i++)
        {
            _a[i] = _a[i + 1];
        }
        _size--;
    }

    bool Empty()
    {
        return (_size == 0);
    }

    T& Back()
    {
        return _a[_size - 1];
    }

    void Checkcapacity()
    {
        if (_size == _capacity)
        {
            size_t newcapacity = _capacity * 2 + 3;
            T* tmp = new T[newcapacity];
            if (_a)
            {
                for (size_t i = 0; i < _size; i++)
                {
                    tmp[i] = _a[i];
                }
            }
            delete[] _a;
            _a = tmp;
            _capacity = newcapacity;
        }
    }

    void Print()
    {
        for (size_t i = 0; i < _size; i++)
        {
            cout << _a[i] << " ";
        }
        cout << endl;
    }

protected:
    T* _a;
    size_t _size;
    size_t _capacity;
};

void Funtest()
{
    Vector<int> v;
    v.PushBack(1);
    v.PushBack(2);
    v.PushBack(3);
    v.PushBack(4);
    v.Print();

    Vector<string> v1;
    v1.PushBack("11");
    v1.PushBack("22");
    v1.PushBack("33");
    v1.PushBack("44");
    v1.Print();
}


template<class T,class Container>//适配器
class Stack
{
public:
    void Push(const T& x)
    {
        _con.PushBack(x);
    }

    void Pop()
    {
        _con.PopBack();
    }

    T& Top()
    {
        return _con.Back();
    }

    size_t Size()
    {
        return _con.Size();
    }

    bool Empty()
    {
        return _con.Empty();
    }

protected:
    Container _con;
};

void Teststack()
{
    Stack<int,Vector<int>> s;
    s.Push(1);
    s.Push(2);
    s.Push(3);
    while (!s.Empty())
    {
        cout << s.Top() << " ";
        s.Pop();
    }
    cout << endl;
}

int main()
{
    //Funtest();
    Teststack();
    system("pause\n");
    return 0;
}

执行结果如下:
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页