1. 程式人生 > >C++實現順序棧

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();
    //棧裡只剩下#證明所有括號匹配成功
}