数据结构(四)——顺序栈

栈——顺序栈

栈的概念

​ 栈是只能在一端进行操作的线性表,栈顶(top)是可以进行插入(压栈)、删除(出栈)的一端,另一端则称为栈底,栈是 LIFO(后进先出)的存储结构

顺序栈

​ 顺序栈是通过顺序存储方式,利用一组连续的存储单元依次存放栈底到栈顶的数据元素的数据结构

顺序栈的定义

​ 和顺序表的定义相似,顺序栈也通过一个数组进行数据元素的存储,不同的是顺序栈还需存放一个 top 来表示栈顶的位置

#define MAXSIZE 100

typedef struct {
	int data[MAXSIZE];
	int top;
}SeqStack;

顺序栈的初始化

​ 顺序栈的初始化实际上就是为栈分配内存,并将栈顶位置(top)赋值为 -1 的过程

SeqStack *InitSeqStack() {
	SeqStack *s;
	s = (SeqStack*)malloc(sizeof(SeqStack));
	s->top = -1;
	return s;
}

判断顺序栈是否为空

​ 判断顺序栈是否为空,只需要检测栈顶位置(top)是否为 -1

int Empty_SeqStack(SeqStack *s) {
	if (s->top == -1)
		return 1;
	else
		return 0;
}

顺序栈入栈

​ 入栈又称压栈,顾名思义就是将数据压入栈中,原理是先检测栈是否已满,之后让栈顶指针自加 1,再令栈顶元素等于要压入的数据

int Push_SeqStack(SeqStack *s, int d) {
	if (s->top == MAXSIZE - 1)
		return 0;
	else {
		s->top++;
		s->data[s->top] = d;
		cout << "压入 " << d << endl;
		return 1;
	}
}

顺序栈出栈

​ 出栈又叫弹出,即将栈顶元素移除,可以把顺序栈想成一摞盘子,放盘子时需要把新放的盘子放在之前的盘子上,而取盘子时也要先取走后方上来的盘子,这就是 LIFO 后进先出存储结构的模型,同样的原理,出栈只需要令栈顶指针自减 1 即可,这里可以不用管原栈顶元素的值,因为在下一次压栈时,由于栈顶位置(top)已经前移,所以这个值就会被覆盖

int Pop_SeqStack(SeqStack *s) {
	if (Empty_SeqStack(s))
		return 0;
	else {
		cout << "弹出 " << s->data[s->top] << endl;
		s->top--;
		return 1;
	}
}

获取栈顶元素

​ 获取栈顶元素也很好理解,就是返回当前栈顶位置(top)锁对应的数据元素的值

int Top_SeqStack(SeqStack *s) {
	if (Empty_SeqStack(s))
		return 0;
	else {
		return (s->data[s->top]);
	}
}

总结

​ 栈就是一个只能在一端进行操作的线性表,栈的这种特性也使他具有记忆的功能

发布了38 篇原创文章 · 获赞 44 · 访问量 3434

猜你喜欢

转载自blog.csdn.net/scfor333/article/details/103219038