栈
栈是先进后出的线性表。即限定只能在表的一段进行插入和删除操作的线性表。
栈结构在计算机中有广泛的应用。常见的软件的”撤销”和”恢复”功能就是用栈实现的。
栈的顺序存储结构示例代码
template<typename T>
class SqStack
{
public:
SqStack(int k = 1);
~SqStack(){ delete[]m_base; }
void Clear() { m_top = m_base; }
bool Empty() const { return m_top == m_base; }
int Length() const { return m_top - m_base; }
T Top() const;
bool Push(T elem);
bool Pop();
void Display();
private:
T *m_base; //栈存储空间的基址
T *m_top; //栈顶指针
int m_size; //栈当前的存储容量
};
template<typename T>
SqStack<T>::SqStack(int k = 1)
{
m_base = new T[k];
if (nullptr == m_base)
{
cout << "申请空间失败" << endl;
return;
}
m_top = m_base;
m_size = k;
}
template<typename T>
T SqStack<T>::Top() const //返回栈顶元素
{
if (m_top > m_base) //栈不为空
{
return *(m_top-1); //返回栈顶元素 为什么要减1? <== [base, top)
}
else
{
return false;
}
}
template<typename T>
bool SqStack<T>::Push(T elem)
{
if (m_top - m_base == m_size) //栈满,需要重新申请空间
{
T *newbase = new T[m_size * 2];
if (nullptr == newbase)
{
return false;
}
for (int i = 0; i < m_top - m_base; ++i) //将原本的数据复制到新的内存中
{
*(newbase + i) = *(m_base + i);
}
delete []m_base; //释放旧数据的内存
m_base = newbase; //将基址指针指向新的内存
m_top = m_base + m_size; //将栈顶指针指向新的栈顶地址
m_size *= 2; //更新栈顶大小
}
*m_top = elem; //将元素赋给栈顶
m_top++; //栈顶指针自增
return true;
}
template<typename T>
bool SqStack<T>::Pop()
{
if (m_top == m_base) //判断栈是否为空
{
return false;
}
--m_top; //若不为空,将栈顶指针自减1
return true;
}
template<typename T>
void SqStack<T>::Display()
{
T *temp = m_base;
while (temp < m_top)
{
cout << *temp++ << " ";
}
cout << endl;
}
测试程序:
int main()
{
SqStack<int> s;
cout << s.Empty() << endl;
for (int i = 1; i < 10; ++i)
{
s.Push(i);
}
cout << s.Top() << endl;
s.Pop();
s.Display();
system("pause");
return 0;
}
运行结果: