数据结构-----栈的顺序储存

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:本博客代码参考程杰《大话数据结构》

猜你喜欢

转载自blog.csdn.net/qq_46293423/article/details/104950574