顺序栈
-
特点:先进后出、后进先出
-
栈底、栈顶
-
栈的操作
-
Push 将数据压入堆栈(stack[++top] = item;)
-
Top 栈顶位置
-
Pop 删除栈顶位置的数据
-
IsEmpty 判断栈是否为空,即判断top是不是-1
-
//创建头函数 MyStack.h
#ifndef _MYSTACK_H
#define _MYSTACK_H
#include "MyUtil.h"
template<class T>
class MyStack {
public:
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.";
//top--;
stack[top--].~T();
}
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; //删除动态数组stack
}
template<class T>
void MyStack<T>::Push(const T& item) { //Push函数,将item压入堆栈
if (top == capacity - 1) {
Changesize1D(stack, capacity, 2 * capacity);
capacity *= 2;
}
stack[++top] = item;
}
#endif
//创建头函数 MyUtil.h
#ifndef _MYUTIL_H
#define _MYUTIL_H
#include<math.h>
using namespace std;
template<class T>
void Changesize1D(T*& a, const int oldSize, const int newSize);///数组尺寸放大一倍
template<class T>
void Changesize1D(T*& a, const int oldSize, const int newSize) {
if (newSize < 0) throw"New lenth must be >=0";
T* temp = new T[newSize];
//int number = min(oldSize, newSize);
int number = 0;
if (oldSize > newSize) number = newSize;
else number = oldSize;
copy(a, a + number, temp);
delete[] a;
a = temp;
}
#endif
//main.cpp 主函数,用来测试
#include<iostream>
#include"MyStack.h"
#include "MyUtil.h"
using namespace std;
class Dog {
};
int main() {
MyStack<string> myStringStack;
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;
st.Pop();
cout << st.Top() << endl;
cout << "Test!" << endl;
return 0;
}