栈:
- 是一种特殊的线性表(具有线性关系,即前驱和后继)
特性:
- 先进后出
- 限制了线性表插入和删除的位置,始终只在栈顶进行
- 栈底是固定的,最先进栈的只能在栈底
操作:
- 栈的插入操作:进栈(压栈)
- 栈的删除操作:出栈(弹栈)
- 销毁栈
- 清空栈
- 获取栈顶元素
- 获取栈的大小
栈的顺序存储:
- 栈的顺序存储简称顺序栈,它是运算受限的顺序表
- 顺序栈的存储结构:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指向栈顶元素在顺序表中的位置
设计与实现:
- 栈是一种特殊的线性表,所以栈的顺序存储可以通过顺序线性表(数组)来实现
- 以数组右边为栈顶,数据的插入和删除不需要频繁移动元素
栈的顺序存储C++代码实现
SeqStack.hpp
注: 在使用模板类时,函数的声明和实现必须在同一个文件中,否则会报错
顺序栈的声明
#ifndef SEQSTACK_H
#define SEQSTACK_H
#include <iostream>
//数组模拟栈的顺序存储
const int MAX_SIZE = 1024;
template <typename T>
class SeqStack
{
private:
T data[MAX_SIZE];
int size;
public:
SeqStack();
~SeqStack();
//入栈
void push(T date);
//返回栈顶元素
T top();
//出栈
void pop();
//判断是否为空
bool isEmpty();
//返回栈中元素个数
int getSize();
//清空
void clear();
};
#endif
顺序栈的定义(实现)
template <typename T>
SeqStack<T>::SeqStack()
{
size = 0;
}
template <typename T>
SeqStack<T>::~SeqStack()
{
}
//入栈
template <typename T>
void SeqStack<T>::push(T date)
{
if (size == MAX_SIZE)
{
std::cerr << "ERRER: The stack is full!" << std::endl;
return;
}
data[size] = date;
size++;
}
//返回栈顶元素
template <typename T>
T SeqStack<T>::top()
{
if (size == 0)
exit(EXIT_FAILURE);
return data[size - 1];
}
//出栈
template <typename T>
void SeqStack<T>::pop()
{
if (size == 0)
{
std::cerr << "ERROR: The stack is empty!" << std::endl;
return;
}
size--;
}
//判断是否为空
template <typename T>
bool SeqStack<T>::isEmpty()
{
if (size == 0)
return true;
return false;
}
//返回栈中元素个数
template <typename T>
int SeqStack<T>::getSize()
{
return size;
}
//清空
template <typename T>
void SeqStack<T>::clear()
{
size = 0;
}
main.cpp(测试)
#include <iostream>
#include "SeqStack.hpp"
struct Person
{
char name[64];
int age;
};
int main()
{
SeqStack<Person> stack;
std::cout << stack.getSize() << std::endl;
//创建数据
Person p1 = {"aaa", 10};
Person p2 = {"bbb", 23};
Person p3 = {"ccc", 24};
Person p4 = {"ddd", 45};
Person p5 = {"eee", 54};
//入栈
stack.push(p1);
stack.push(p2);
stack.push(p3);
stack.push(p4);
stack.push(p5);
//输出
while (stack.getSize()>0)
{
Person p = stack.top();
std::cout << p.name << ":" << p.age << std::endl;
stack.pop();
}
return 0;
}