01.栈的定义
栈是一种后进先出的数据结构,也就是说他不像数组那样子,可以在中间插入,栈只能够在上一个存入数据的后面再存数据,而且只能取现进去的数据。栈简称LIFO结构。
栈是限定仅在表位进行插入和删除操作的线性表。允许插入和删除的一端叫栈顶,另一端叫栈底,不含任何元素的叫空栈。
栈的插入操作,叫做进栈,也称作压栈,入栈。
栈的删除操作,叫做出栈,也叫作弹栈。
02.栈的结构
栈里面有一个top变量来指示栈顶元素在数组中的位置,而且栈的大小是先定义好的,和数组很相似。这里还可以引入了一个栈底bottom的变量,如果有这个变量,要清空栈和销毁栈会变得很方便,(s -> top = s -> bottom)就可以清空栈。但是很多时候并没有使用过栈底变量,高级语言封装的栈就是标准栈,我这里就用的标准栈。一般top = -1就表示是一个空栈,top必须小于MAXSIZE。
//栈的结构定义
typedef int SElemType; /*SElemType 类型根据实际情况而定,这里假设为int*/
typedef struct
{
SElemType data[MAXSIZE];
int top; /*用于栈顶指针*/
}SqStack;
/*顺序栈的初始化*/
int InitStack(SqStack *s)
{
s->top=-1;
return OK;
}
03.进栈操作
进栈就是把top这个栈顶指针上移,把元素放入栈顶的空间里。
/*插入元素e为新的栈顶元素*/
Status Push(SqStack *s, SElemType e)
{
if(s->top == MAXSIZE-1) //栈满
{
return ERROR;
}
s->top++; //栈顶指针增加1
s->data[s->top] = e; //将新插入元素赋值给栈顶空间
return OK;
}
04.出栈操作
出栈也很简单,就是把top减一。因为没有任何循环,所以这两个操作的时间复杂度都是O[1]。
/*出栈操作*/
Status Pop(SqStack *s, SElemType *e)
{
if(s->top == -1) //栈为空
return ERROR;
*e=s->data[s->top]; //将要删除的栈顶元素复制给e
s->top--; //栈顶指针减一
return OK;
}
顺序栈的总结
1.只能在栈顶进行增减操作,后进先出。因为这一点可以进行一些顺序结构的判定,比如括号的匹配问题。
2.缺点是:要先定义栈的大小,如果数据太多就容易溢出。
ps:本博客代码参考程杰《大话数据结构》