栈是一种常用的数据结构,栈常用在系统软件和或者算法中。
栈使用数组来做顺序栈,链式站用链表来做。今天使用动态数组来设计栈。
栈,后进先出(LIFO),先进后出(FILO)
push,进栈
pop,出栈
peek,看一下栈顶
我使用的是VS Ultimate2013
新建一个空项目,在头文件里面添加两个头文件MyStack.h和MyUtil.h
在源文件里面添加main.cpp
//MyUtil.h
//当栈的长度不够时,自动扩大两倍
#ifndef _MYUTIL_H
#define _MYUTIL_H
template<class T>
void ChangeSize1D(T* &a, const int oldSize, const int newSize){
if (newSize < 0)throw "New length must be >= 0";
T* temp = new T[newSize];
int number = min(oldSize, newSize);
std::copy(a, a + number, temp);
delete[] a;
a = temp;
}
#endif
//MyStack.h
#ifndef _MYSTACK_H
#define _MYSTACK_H
#include "MyUtil.h"
//MyStack类,
template<class T>
class MyStack{
public:
//构造函数,默认stack的容量是10
MyStack(int stackCapacity = 10);
//析构函数
~MyStack();
//四个栈操作函数
bool IsEmpty() const;
T& Top() const;
void Push(const T& item);
void Pop();
private:
T *stack;
int top;
int capacity;
};
//出栈
template<class T>
void MyStack<T>::Pop(){
if (IsEmpty()) throw "Stack is empty, Cannot delete.";
stack[top--].~T();//这里这么写是可以析构函数stack,这里是经典写法
}
//判断是否为空
template<class T>
inline bool MyStack<T>::IsEmpty() const{
return top == -1;
}
//输出栈顶
template<class T>
inline T& MyStack<T>::Top() const{
if (IsEmpty()) throw "Stack is empty";
return stack[top];
}
//构造栈
template<class T>
MyStack<T>::MyStack(int stackCapacity):capacity(stackCapacity){
if (capacity < 1) throw "stack capacity must be > 0";
stack = new T[capacity];
top = -1;
}
//析构栈
template <class T>
MyStack<T>::~MyStack(){
delete[] stack;
}
//入栈
template<class T>
void MyStack<T>::Push(const T& item){
if (top == capacity - 1){
ChangeSize1D(stack, capacity, 2 * capacity);
capacity = capacity * 2;
}
stack[++top] = item;
}
#endif
//main.cpp
//用来测试
#define _SCL_SECURE_NO_WARNINGS
#include<iostream>
#include "MyStack.h"
#include<algorithm>
using namespace std;
int main(){
//这里可以使用各种栈
//MyStack<string> myString;
//MyStack<Dog> dogStack;
MyStack<int> st(200);
st.Push(99);
st.Push(22);
st.Push(18);
st.Push(67);
cout << st.Top() << endl;
st.Pop();
cout << st.Top() << endl;
st.Pop();
cout << st.Top() << endl;
cout << "Test" << endl;
system("pause");
return 0;
}
总结:栈是比较常用的数据结构,也是算法中经常的考点。使用动态数组来构造顺序栈。