栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈的基本特点
- 只能在表尾(即栈顶)进行增加和删除操作
- 遵循先进后出(First In Last Out),简称FILO结构
- 是一种线性结构
栈的基本操作
栈的基本操作有进栈,出栈,初始化,判断是否满栈,栈是否为空,栈的大小,取栈顶元素等等
(1)头文件及宏定义
#include <stdio.h>
#include <stdlib.h>
//返回真或返回假
#define TRUE 1
#define FALSE 0
//返回执行状态
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2 //内存分配失败,用于exit语句
typedef int Status; //定义函数返回类型
typedef int SElemType; //定义元素类型
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
拓展(c++中):在c++中,有关于栈的标准库,使用相应的头文件即可调用c++库中的栈的操作。其头文件为:#include < stack >
(2)创建栈
typedef struct
{
SElemType *base; //栈底指针,值为NULL表明栈不存在
SElemType *top; //栈顶指针,栈顶元素的下一个地址
int stacksize; //当前已分配空间,以元素为单位
} SqStack;
拓展(c++):c++中创建栈直接用:stack < int > s;创建一个空的s栈,其中“<>”中所填写的是数据类型,也可以是string等等
(3)初始化
Status initStack(SqStack &s)
{
s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); //申请空间
if (!s.base)
exit(OVERFLOW);
s.top = s.base;
s.stacksize = STACK_INIT_SIZE;
return OK;
}
(4)入栈
Status push(SqStack &s, SElemType e)
{
if (s.top - s.base >= s.stacksize)
{
s.base = (SElemType *)realloc(s.base, (s.stacksize + STACK_INCREMENT) * sizeof(SElemType));
s.top = s.base + s.stacksize;
s.stacksize += STACK_INCREMENT;
}
*s.top++ = e;
return OK;
}
拓展(c++):c++中入栈(或压栈)直接调用,即s.push(a);a为要入栈的元素,a必须与栈s的类型一致。
(5)出栈:
Status pop(SqStack &s, SElemType &e)
{
e = *(--s.top);
return OK;
}
拓展(c++):c++中出栈:s.pop();
(7)取栈顶元素:
Status getTop(SqStack s, SElemType &e)
{
e = *(s.top - 1);
return OK;
}
拓展(c++):x=s.top();
(8)判断栈是否为空:
Status isEmpty(SqStack s)
{
if (s.top == s.base)
return TRUE;
return FALSE;
}
拓展(c++):s.empty(),若为空,则s.empty()==1,若不为空,则s.empty()==0;
(9)返回栈的元素个数
int getStackElemNum(SqStack s)
{
return s.top - s.base;
}
拓展(c++):s.size();
(10)销毁栈:
Status destoryStack(SqStack *s)
{
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize = 0;
return OK;
}
好了,关于栈的学习就到这儿,如若文章有何问题,敬请指出