栈是一种特殊的线性表,其插入和删除操作只能在一端进行(栈顶),具有后进先出的特点。
栈的实现
#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();
//栈里只剩下#证明所有括号匹配成功
}