数据结构:链栈的实现

栈的原理不再细说(可以参考严蔚敏版 或 王道考研版的数据结构),只贴代码。

主要应用到的是单链表的头插法

头插法,顾名思义,每次插入新的结点都在头部插入,新插入的结点成为首元结点。

对於单链表定义规则:插入结点的时候只能从头部插入,删除结点的时候只能从头部删除,这样的单链表其实就是一个栈。正是基于这样的准则实现的链栈。

这里给的是不带头结点实现链栈,但是学习过程中带头结点和不带头结点的链栈都应该会实现

/* 采用不带头结点的单链表实现栈 */ 

#include <stdio.h>
#include <stdlib.h>

#define ElemType int

typedef struct LinkNode{
	ElemType data;
	struct LinkNode *next;
} LinkNode, *LinkStack; 

// 初始化栈为空 
void InitStack(LinkStack &s)
{
	s = NULL; 
}
// 入栈操作 
bool StackPush(LinkStack &s, ElemType e)
{
	LinkNode* node = (LinkNode *)malloc(sizeof(LinkNode));
	if(node == NULL){ // 申请内存空间失败 
		return false;
	}
	node->data = e;
	node->next = s; 
	s = node; 
	return true;
}
// 出栈操作
bool StackPop(LinkStack &s) 
{
	if(s == NULL){	// 如果栈为空 
		return false;
	}
	LinkNode *tmp = s;
	s = s->next;
	free(tmp); // 删除此栈顶结点 
	return true;
}
ElemType GetTop(LinkStack s)
{
	if(s == NULL){ // 栈为空 
		exit(1);
	}
	return s->data;	
}

// 判断栈是否为空 
bool StackIsEmpty(LinkStack &s)
{
	return (s == NULL) ? true : false; 
}

int main()
{
	LinkStack s;
	InitStack(s);
	for(int i = 0; i < 10; i++){
		StackPush(s, i+1);
	}
	
	for(int i = 0; i < 10; i++){
		printf("%d\n", GetTop(s));
		StackPop(s);
	}
	printf("\n%d\n", StackIsEmpty(s));
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章