数据结构之栈

一、栈的定义

所谓栈的本质也是一个线性表,只不过他具有进出,并且进出满足先进后出的原则。

一种定义方式为数组定义方式,这种方式就要求我们开辟一个特定大小的数组,就不能节省空间。
如下所示:

#define MaxSize < 储存数据元素的最大个数>
typedef struct{
	ElementType Data[MaxSize];
	int Top;//栈顶序号
}Stack

另一种方式为链表的定义方式,这种方式是以下一个元素地址作为传递的方式,这样就不用开辟一个很大的数组。
如下所示:

typedef struct Node{
	ElementType Data;
	struct Node *Next; 
}LinkStack;
LinkStack *Top;

注意:此处的元素为栈顶指针。


二、链式栈表的编写
我们仅以链式栈表来编写栈表程序
(1)堆栈初始化
所谓堆栈初始化就是创建一个空的栈表
需要申请一块空间内存,并且这个栈指向空

LinkStack *CreatStack(void){
	LinkStack *p;
	p = (LinkStack *)malloc(sizeof(struct Node));//开辟一块空间
	P->Next = NULL;
	return p;
}

(2)判断栈是否为空
这个函数只需要看栈顶指向的元素是否为空即可

int IsEmpty(LinkStack *S){
	return (s->next);//只需要看栈顶指向的地址是否为空,如果为空则栈为空
	
}

(3)入栈
就是将元素压栈进入表中。

void Push(ElementType item,LinkStack *s){
	struct Node *p;
	p =(LinkStack *)malloc(sizeof(struct Node));
	p->next = s->next;
	p->Data = item;
	s->next = p;
}

(4)出栈
取出元素,取元素是从栈顶取元素。

ElementType Pop(LinkStack *S){
	struct Node *p;
	ElementType data = NULL;
	//首先判断栈表是否为空
	if(IsEmpty(s)){
		printf("堆栈空");
	}
	else{
		p = s->next;
		s->next = p->next;//栈顶切换
		data = p->Data;数据保存
		free(p);//释放内存
	}	
	return data;
}

三、应用
栈的应用一般用在函数递归中,栈的使用可以节省空间。

 (后续添加)

原文地址:https://www.cnblogs.com/flyingjun/p/5173451.html