- 栈(Stack)是一种线性存储结构,它具有如下特点:
- 栈中的数据元素遵守”先进后出"(First In Last Out)的原则,简称FILO结构。
- 限定只能在栈顶进行插入和删除操作
- 栈的相关概念:
- 栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
- 压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
- 在压栈的过程中,栈顶的位置一直在”向上“移动,而栈底是固定不变的。如果我们要把栈中的元素弹出来:顺序与入栈时相反,这就是所谓的”先入后出“。
- 弹栈:栈的删除操作,也叫做出栈。在弹栈的过程中,栈顶位置一直在”向下“移动,而栈底一直保持不变。
- 栈的常用操作为:
- 弹栈,通常命名为pop
- 压栈,通常命名为push
- 求栈的大小
- 判断栈是否为空
- 获取栈顶元素的值
-
栈的存储结构
栈既然是一种线性结构,就能够以数组或链表(单向链表、双向链表或循环链表)作为底层数据结构。
template<typename T>
class ArrayStack
{
public:
ArrayStack(int s = 10); //默认的栈容量为10
~ArrayStack();
public:
T top(); //获取栈顶元素
void push(T t); //压栈操作
T pop(); //弹栈操作
bool isEmpty(); //判空操作
int size(); //求栈的大小
private:
int count; //栈的元素数量
int capacity; //栈的容量
T * array; //底层为数组
};
/*栈的判空操作*/
template <typename T>
bool ArrayStack<T>::isEmpty()
{
return count == 0; //栈元素为0时为栈空
};
/*返回栈的大小*/
template <typename T>
int ArrayStack<T>::size()
{
return count;
};
/*插入元素*/
template <typename T>
void ArrayStack<T>::push(T t)
{
if (count != capacity) //先判断是否栈满
{
array[count++] = t;
}
};
/*弹栈*/
template <typename T>
T ArrayStack<T>::pop()
{
if (count != 0) //先判断是否是空栈
{
return array[--count];
}
};
/*获取栈顶元素*/
template <typename T>
T ArrayStack<T>::top()
{
if (count != 0)
{
return array[count - 1];
}
};
int _tmain(int argc, _TCHAR* argv[])
{
ArrayStack <int> p(5);
for (int i = 0; i < 5; i++)
{
p.push(i);
}
cout << "栈的大小:"<<p.size() << endl;
cout << "栈是否为空:"<<p.isEmpty() << endl;
cout << "栈顶元素:"<<p.top() << endl;
cout << "依次出栈:" << endl;
while (!p.isEmpty())
{
cout << p.pop() << endl;
}
getchar();
return 0;
}