数据结构(6)——栈 - 顺序栈
后进先出(LTFO),先进后出(FTLO)
栈底,栈顶
栈的操作:Push、Top、Pop、IsEmpty
#include<iostream>
#include "MyStack.h"
using namespace std;
int main()
{
MyStack<int> st;
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;
}
#ifndef _MYUTIL_H
#define _MYUTIL_H
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 length must be >=0";
T* temp = new T[newSize];
/*int number = min(oldSize, newSize); //选择最小数组*/
int number = 0;
if (oldSize > newSize) number = newSize;
else number = oldSize;
std::copy(a, a + number, temp);
delete[] a;
a = temp;
}
#endif
#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.";
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;
}
template<class T>
void MyStack<T>::Push(const T& item)
{
if (top == capacity - 1)
{
ChangeSize1D(stack, capacity, 2 * capacity);
capacity *= 2;
}
stack[++top] = item;
}
#endif