C++实现顺序栈
2017-11-17 15:51
337 查看
栈是一种特殊的线性表,其插入和删除操作只能在一端进行(栈顶),具有后进先出的特点。
栈的实现
#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(); //栈里只剩下#证明所有括号匹配成功 }
相关文章推荐
- 队列的顺序存储及实现(C++版)
- C++实现简单顺序表
- 数据结构笔记之用C++实现顺序栈和链式栈
- 顺序表的C++实现
- 顺序表(C++实现)
- C++实现顺序表、单链表、双链表
- C++创建控件并响应三部曲、设置窗口全屏、OnSize实现控件大小改变、跟踪调试顺序
- 【C++】实现动态顺序表的PushBack(),PopBack(),PushFront(),PopFront(),Find(),Insert
- 剑指offer第十三题【调整数组顺序使奇数位于偶数前面】c++实现
- 顺序栈的实现(SqStack, C++版)
- c++顺序容器内部实现
- 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
- C++入门:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数
- 顺序栈之C++实现
- c++实现顺序表
- 静态查找的方法:顺序查找、对半查找、分块查找,C++代码实现
- C++实现动态顺序表(类和对象)
- 循环顺序队列c++实现
- 顺序栈的C++的实现
- C++实现顺序栈的基本功能