C++实现顺序栈

栈是一种特殊的线性表,其插入和删除操作只能在一端进行(栈顶),具有后进先出的特点。

栈的实现

#include<iostream>
#include<assert.h>
using namespace std;


template<typename T>
class Stack 
{ 
public: 
    Stack(); //创建栈
    void Push(const T& data);//入栈 
    void Pop(); //出栈
    T& Top(); //取栈顶元素
    T& Top()const; 
    size_t Size()const; //栈当前元素个数
    bool Empty()const; //栈是否为空
private: 
    void CheckCapacity(); //检查容量(扩容)

    T* _array; 
    size_t _capacity; 
    size_t _size; 
}; 

#define CAPACITY  4//初始容量
#define NCAPACITY 4//每次扩容增加容量


template <typename T>
Stack<T>::Stack()//创建栈
{
    _capacity = CAPACITY;          //设置容量
    _array = new T[_capacity] ;  //开辟空间
    _size = 0;
}

template<typename T>
void Stack<T>::CheckCapacity()//检查容量
{
    if(_size == _capacity)//栈满扩容
    {
        //开辟新空间
        _capacity+=NCAPACITY;
        T* new_array = new T[_capacity];

        //拷贝数据
        for( int i=0;i<_size;i++)
        {
            new_array[i] = _array[i];
        }

        //释放原来的空间
        delete[] _array;
        _array = new_array;
    }
}

template <typename T>
void Stack<T>::Push(const T& data)//入栈
{
    CheckCapacity();//检查容量
    _array[_size] = data;
    _size+=1;
}

template<typename T>
void Stack<T>::Pop() //出栈
{
    if(0 == _size)
        return;
    _size-=1;
}

template<typename T>
T& Stack<T>::Top()//取栈顶元素
{
    assert(_size);
    return _array[_size-1];
}

template<typename T>
T& Stack<T>::Top()const//取栈顶元素
{
    assert(_size);
    return _array[_size-1];
}

template<typename T>
size_t Stack<T>::Size()const //栈当前元素个数
{
    return _size;
}

template<typename T>
bool Stack<T>::Empty()const//判断栈是否为空
{
    return 0 == _size;
}



int main()
{
    Stack<int> s;
    cout<<s.Empty()<<endl;
    cout<<s.Size()<<endl;
    cout<<endl;

    s.Push(1);
    cout<<s.Top()<<endl;
    s.Push(2);
    cout<<s.Top()<<endl;
    s.Push(3);
    cout<<s.Top()<<endl;
    s.Push(4);
    cout<<s.Top()<<endl;
    s.Push(5);
    cout<<s.Top()<<endl;
    cout<<endl;

    s.Push(6);
    cout<<s.Top()<<endl;
    cout<<s.Empty()<<endl;
    cout<<s.Size()<<endl;
    cout<<endl;

    s.Pop();
    cout<<s.Top()<<endl;
    s.Pop();
    cout<<s.Top()<<endl;
    s.Pop();
    cout<<s.Top()<<endl;
    s.Pop();
    cout<<s.Top()<<endl;
    s.Pop();
    cout<<s.Top()<<endl;
    //s.Pop();
    //cout<<s.Top()<<endl;
    return 0;
}

栈的应用

  • 括号的匹配问题
bool MatchBrackets(char* pStr)
{
    Stack<char> s;
    //s.Push('#')防止栈为空取栈顶元素造成程序崩溃
    for(s.Push('#'); *pStr != '\0';pStr++)
    {
        // 左括号入栈
        if( *pStr=='(' || *pStr=='[' || *pStr=='{' )
            s.Push(*pStr);

        // 出现右括号,若栈顶元素是匹配的左括号则出栈,否则返回false
        switch(*pStr)
        {
        case ')':
            if( '('==s.Top() )
                s.Pop();
            else
                return false;
            break;
        case ']':
            if( '['==s.Top() )
                s.Pop();
            else
                return false;
            break;
        case '}':
            if( '{'==s.Top() )
                s.Pop();
            else
                return false;
            break;
        default:
            break;
        }
    }
    return '#'==s.Top();
    //栈里只剩下#证明所有括号匹配成功
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值