何为栈
从数据结构的角度来说,栈也是线性表,其特殊性则在于栈的基本操作是线性表操作的子集,他们的操作是受限与线性表的。
栈是限定仅在表尾进行插入或删除操作的线性表。因此,对于栈来说,表位端有着特殊的含义,称为栈顶,相应的,表头端称之为栈底。不含任何元素的栈被称之为空栈
栈的实现方法
和线性表类似,栈也有两种实现方法,顺序栈与栈的链表展示。由于栈的链表展示的实现方法和链表无二因此,在这里仅仅是实现了栈的顺序栈的实现方法
建立顺序栈
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附带top指针指示栈顶元素在顺序栈当中的位置。通常习惯以top=0表示空栈
一般来说,在初始化栈的时候不应设定栈的最大容量,应该在栈一开始分配一个合理的内存,然后当栈的空间不够大的时候再去申请一块内存
栈的操作的代码实现
以下为我的初始栈的定义
struct SqStack{
//-----------数据域-------------//
Element data //栈的元素
int sqStackSize; //用于记录栈的大小
//-----------指针域-------------//
SqStack *base; //栈底指针
SqStack *top; //栈顶指针
} ;
以下则是我对栈的基本操作的定义
#define STACK_INITIALIZE_SIZE 100 //初始栈的大小
#define STACKINCREMENT 10 //栈的增长量
class Stack {
public:
Stack();
//初始化栈
void initializeStack(SqStack *sqStack);
//销毁一个栈
void distoryStack(SqStack *sqStack);
//清理一个栈
void clearStack(SqStack *sqStack);
//判断栈是否为空
bool stackEmpty(SqStack sqStack);
//栈的长度
int stackLength(SqStack sqStack);
//获取栈顶元素
SqStack getTop(SqStack *sqStack);
//获取插入元素,并将其作为栈顶
void push(SqStack *sqStack, SqStack &element);
//删除栈顶元素
void pop(SqStack *sqStack);
};
定义的代码实现
初始化栈
void Stack::initializeStack(SqStack * sqStack)
{
sqStack->base = (SqStack *)malloc(sizeof(SqStack)*STACK_INITIALIZE_SIZE);
//申请栈底内存
sqStack->top = sqStack->base; //栈顶等于栈底,表示空栈
sqStack->sqStackSize = STACK_INITIALIZE_SIZE; //记录栈的大小
}
销毁一个栈
void Stack::distoryStack(SqStack * sqStack)
{
//释放栈
delete[] sqStack->base;
}
清理一个栈
void Stack::clearStack(SqStack * sqStack)
{
//从栈顶开始不断修改栈的内容
while (sqStack->base != sqStack->top) {
//释放栈顶
sqStack->top--;
//栈的元素减一
sqStack->myData = NULL;
}
}
判断栈是否为空
bool Stack::stackEmpty(SqStack sqStack)
{
//若栈顶等于栈底则说明栈为空
if (sqStack.base == sqStack.top) {
return true;
}
//否则栈不为空
return false;
}
栈的长度
int Stack::stackLength(SqStack sqStack)
{
int length = 0;
//从栈顶开始不断向下寻找,直到为空栈为止
while (sqStack.top != sqStack.base) {
sqStack.top--;
length++;
}
return length;
}
获取栈顶元素
SqStack Stack::getTop(SqStack *sqStack)
{
//若已经到达空栈
if (sqStack->base == sqStack->top)
cout << "栈已经空了" << endl;
/*
每增加一个栈顶元素,栈顶的取值就要加一(此时栈顶指针指向的是一块为初始化的内存块),所以,在获取栈顶元素的时候,首先要让栈顶减一,这样才能获取到正确的栈顶元素
*/
return *(sqStack->top - 1);
}
获取插入元素,并将其作为栈顶
void Stack::push(SqStack * sqStack, SqStack &element)
{
//若栈的空间已经到达上限
if (sqStack->top - sqStack->base > sqStack->sqStackSize) {
//增加栈的大小
sqStack->base = (SqStack *)realloc(sqStack->base, (sqStack->sqStackSize + STACKINCREMENT)*sizeof(SqStack));
//若分配内存失败
if (!sqStack->base) {
exit(0);
}
//更改栈顶指针的指向,使之正确指向当前的栈顶
sqStack->top = sqStack->base + sqStack->sqStackSize;
//增加栈的存储大小标记
sqStack->sqStackSize += STACKINCREMENT;
}
//完成赋值,并使栈顶的指针向上增加
*sqStack->top++ = element;
}
删除栈顶元素
void Stack::pop(SqStack * sqStack)
{
//释放栈顶(若栈不为空栈则释放栈顶)
/*由于在插入内容的时候,栈顶指针会进行+1操作,因此此时的指针指向的是栈顶再往上的元素,因此此时需要对栈顶指针进行-1操作*/
if (sqStack->base != sqStack->top) {
sqStack->top--;
}
//清除里面的元素
sqStack->myData = NULL;
}