408-数据结构-栈

栈是一种特殊操作的线性表。因为他满足线性表的三个特征,元素类型相同,个数有限,有顺序。
栈特殊操作为LIFO,后进先出。

线性表分为两类,第一类为顺序表,第二类为链表。那么栈也可以由此分为两类,称为顺序栈与链栈。

由于栈限制了操作,所以操作不想普通线性表如此复杂,一般只包含这几种:

  1. 初始化 InitStack
  2. 入栈 push
  3. 出栈 pop
  4. 判空 isEmpty
  5. 获得栈顶getTop
  6. 析构 destroy

获得栈顶getTop与pop的区别在于,getTop不会将栈顶弹出,只会返回值,pop也会返回值,但是也弹出的栈顶。

顺序栈

顺序栈即为顺序表实现,即为数组,通常包含栈顶下标充当栈顶指针作用。一般写法也有两种,栈顶指针初始化为-1与栈顶指针初始化为0,差别不大。在此以栈顶指针初始化为-1为例。

#define MaxSize 10
typedef struct {
	ElemType data[MaxSize];
	int top;
}Stack;

//初始化
void InitStack(Stack &s){
	s.top = -1;
}

bool isEmpty(Stack s){
	return s.top == -1;
}

bool push(Stack &s, ElemType e){
	if (top == MaxSize)
		return false;
	data[++top] = e;
	return true;
}

ElemType pop(Stack &s){
	if (top == -1);
		return NULL;
	return data[top--];
}

ElemType getTop(Stack &s){
	if (top == -1);
		return NULL;
	return data[top];
}

void destroy(Stack &s){
	s.top = -1;
}

链栈

以含有头指针的链表为例子。

typedef struct Node {
	ElemType data;
	Node * next;
}SNode, *Stack;

void InitStack(Stack & s){
	s = (SNode *)malloc(sizeof(SNode));
	s->next = NULL;
}

bool isEmpty(Stack &s){
	return s->next == NULL;
}

bool push(Stack &s, ElemType e){
	SNode *p = (SNode * )malloc(sizeof(SNode));
	if (p == NULL)
		return false;
	p->next = s->next;
	p->data = e;
	s->next = p;
	return true;
}

bool pop(Stack &s, ElemType &e){
	if (isEmpty(s))
		return false;
	SNode *p = s->next;
	e = s->data;
	s->next = p->next;
	free(p);
	return true;
}

bool getTop(Stack &s, ElemType &e){
	if (isEmpty(s))
		return false;
	e = s->next->data;
	return true;
}

void destroy(Stack &s){
	LNode * p = s;
	while (p != NULL){
		LNode * tem = p;
		p = p->next;
		free(tem);
	}
}

共享栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值