数据结构--栈

栈的定义和特点

栈是一个特殊的线性表,是仅限定在一端(通常为表尾)进行插入和删除操作的线性表,又称为后进先出的线性表,简称LILO结构。
表尾(an端)称为栈顶top,表头(a1端)称为栈底base。插入元素到栈顶(即表尾)的操作称为入栈(push(x)),删除栈顶(表尾)的元素称为出栈(pop(x))。
在这里插入图片描述

顺序栈的基本操作

顺序栈的表示

#define MAXSIZE 100
typedef struct{
	SElemType *base;	//栈底指针
	SElemType *top;		//栈顶指针
	int stacksize;		//栈的最大容量
}SqStack;

初始化

bool initStack(SqStack &s){
	s.base = new SElemType[MAXSIZE];
	if (!s.base){
		return false;
	}
	s.top = s.base;
	s.stacksize = MAXSIZE;
	return true;
}

判断顺序栈是否为空

bool StackEmpty(SqStack s){
	if (s.top == s.base){
		return true;
	}
	else {
		return false;
	}
}

求顺序栈的长度

int stackLength(SqStack s){
	return s.top - s.base;
}

清空顺序栈

bool clearStack(SqStack &s){
	if (s.base) {
		s.top = s.base;
	}
	return true;
}

销毁顺序栈

bool destoryStack(SqStack &s){
	if (s.base){
		delete s.base;
		s.base = s.top = NULL;
		s.stacksize = 0;
	}
	return true;
}

顺序栈的入栈

bool push(SqStack &s, SElemType e){
	if (s.top - s.base == stacksize){
		return false;
	}
	*s.top = e;
	s.top++;
}

顺序栈的出栈

bool pop(SqStack &s,SElemType &e) {
	if (s.top <= s.base) {
		return false;
	}
	s.top--;
	e = *s.top;
	return true;
}

链栈

链栈是运算受限的单链表,只能在链表头部进行操作

链栈的表示

typedef struct StackNode {
	SElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;
LinkStack s;

链栈的结构如图所示
在这里插入图片描述

链栈的特点

  1. 链表的头指针就是栈顶
  2. 不需要头结点
  3. 基本不存在栈满的情况
  4. 空栈相当于头指针指向空
  5. 插入和删除仅在栈顶处执行

链栈的初始化

bool initStack(LinkStack &s){
	s = NULL;
	return 1;
}

判断链栈是否为空

bool StackEmpty(LinkStack s){
	if (s == NULL){
		return true;
	}
	else{
		return false;
	}
}

链栈的入栈

bool push(LinkStack &s,SElemType e){
	StackNode *p = new StackNode;
	p -> data = e;	
	p -> next = s;	//将新结点插入栈顶
	s = p;	//修改栈顶指针
	return true;
}

链栈的出栈

bool pop(LinkStack &s,SElemType &e){
	StackNode *p = new StackNode;
	if (s == NULL){
		return false;
	}
	e = s -> data;
	p = s;
	s = s -> next;
	delete p;
	return true;
}

取出栈顶元素

SElemType getTop(LinkStack s){
	if (s != NULL){
		return s -> data;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值