C++實現順序棧
阿新 • • 發佈:2019-01-30
棧是一種特殊的線性表,其插入和刪除操作只能在一端進行(棧頂),具有後進先出的特點。
棧的實現
#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();
//棧裡只剩下#證明所有括號匹配成功
}