前言
栈是基本的数据结构。其特点是添加和删除(访问)数据都在线性表的一端(头端)。数据访问遵循后进先出(LIFO)的原则。栈一般用数组或者链表来实现。数组需要静态分配数据空间,占用空间比较大。链表则根据实际需要动态分配数据空间,占用空间相对小一些。本文用单向链表实现栈。程序用C++实现。本文是C++、数据结构及算法学习的一个小小练习。供大家参考。
栈的操作
栈的操作主要就两个:入栈(push)和出栈(pop)。顾名思义,入栈就是将数据压入栈中保存;出栈就是将数据弹出栈,同时访问数据。
数据结构和算法描述
节点的结构
节点(Node)分为两部分,数据和链接部分。数据部分存储数据,可以根据实际情况分为若干字段。本文数据部分分两个字段:key和data。链接部分就是一个指针,指向下一个节点。然后让头指针指向第一个节点,这样一个链式的栈就形成了。C++代码如下:
struct Node {
int key;
string data;
Node *next=nullptr;
}
C++的结构允许有自己的构造函数,我们将上面的节点结构改写一下,包含构造函数:
struct Node {
int key;
string data;
Node *next=nullptr;
Node(int ky, string da, Node *nxt=nullptr) : key(ky), data(da), next(nxt) {
};
}
算法描述
入栈和出栈的算法比较简单,直接用C++描述如下。
push(int ky, string da)
{
head=new Node(ky,da,head);
return;
}
pop(int &ky, string &da)
{
Node *p;
p=head;
if (nullptr!=head) {
ky=key;
da=data;
head=head->next;
delete p;
}
return;
}
类的定义
栈定义成一个类,其上定义了构造函数、析构函数、入栈(push)、出栈(pop)、判断空栈函数(isEmpty())以及指向链表头节点的指针head。C++代码如下:
class