栈和队列是两种重要的线性结构。从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表基本操作的子集。,它们是操作受限的线性表,因此可称为限定性的数据结构。
1.栈
栈是限定仅在表尾进行插入或删除操作的线性表。因此对栈来说,表尾端有其特殊含义,称为栈顶,表头端称为栈底。不含元素的空表称为空栈。栈顶实现元素的进出,栈的修改遵循后进先出的原则。因此,栈又称为后进先出(last in first out)的线性表(简称LIFO结构)。
1.1栈的表示和实现
和线性表类似,栈也有两种存储表示方法。
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示zhan栈顶元素在顺序栈中的位置。通常习惯做法是以top=0表示空栈,鉴于c中数组下标以0开始,则用c作描述语言时,如此设定会带来很大的不便(不太清楚哪里不便??);另一方面,由于栈在使用的过程中所需最大空间的大小很难估计,因此,一般来说,在初始化设空栈是不应限定栈的最大容量。一个比较合理的做法是,先为栈分配一个基本容量,然后在应用的过程中,当栈的空间不够使用时za再逐段扩大。为此可设定两个常量:STACK_INIT_SIZE(存储空间初始分配量)和STACKINCREMENT(存储空间分配增量),并以下述类型说明作为顺序栈的定义。
typedef struct {
int *base;//类型要看元素是什么类型
int *top;
int stacksize;
}Sqstack; //最大容量
top=base可作为栈空的标记。每当插入新元素时,指针top+1;删除时,指针top-1;因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。
以下是顺序栈的基本操作的展示:
#include<iostream>
#include <cstdlib>
#include <cstdio>
#define STACK_INIT_SIZE 100
#define STACKICREAMENT 10
typedef struct {
int *base;//类型要看元素是什么类型
int *top;
int stacksize;
}Sqstack;
//--------------基本操作算法----------
bool InitStack(Sqstack &s)
{
//创建一个空栈
s.base = new int;
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return 1;
}
bool GetTop(Sqstack &s, int &e) {
//若栈不为空,则用e返回s的栈顶元素,并返回1;否则返回0
if (s.top == s.base)return 0;
e = *(s.top - 1);
return 1;
}
bool Push(Sqstack &s, int e) {
//插入元素e为新栈顶元素
*s.top++ = e;//由于new为动态分配储存空间,故省略空间已满的情况,此处与malloc函数处理不同
return 1;
}
bool pop(Sqstack &a