C\C++学习笔记02--顺序栈和链栈的初识篇

一、栈的顺序储存结构

#include <stdlib.h>
#include <stdio.h>
#define MaxSize 10

//顺序栈的抽象数据类型
typedef struct
{
	int data[MaxSize];		                //存放栈中的数据元素
	int top;					//栈顶指针
}SqStack;					        //顺序栈类型

//初始化栈
void InitStack(SqStack *&s)
{
	s = (SqStack*)malloc(sizeof(SqStack));		//分配一个顺序栈空间,首地址存放在s中
	s -> top = -1;					//栈顶指针置为-1
}

//销毁栈
void DestroyStack(SqStack *&s)
{
	free(s);
}

//判断栈是否为空
bool StackEmpty(SqStack *s)
{
	if (s->top == -1)
		printf("这是一个空栈\n");
	else
		printf("这不是空栈\n");
	return (s->top == -1);				//该运算实际上用于判断条件s->top = -1是否成立
}

//进栈->该算法的执行过程是,在栈不满的情况下,先将栈顶指针加1,然后插入元素
bool Push(SqStack *&s, int e)	
{
	if (s->top == MaxSize - 1)
		return false;
	s->top++;
	s->data[s->top] = e;
	return true;
}

//出栈->该算法的执行过程是,在栈不为空的情况下先将栈顶元素赋给e,然后将栈顶指针减1
bool Pop(SqStack *&s, int &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	s->top--;
	return true;
}

//取栈顶元素->该算法的执行过程是在栈不为空的情况下将栈顶元素赋给e,并返回真,否则返回假
bool GetTop(SqStack* s, int &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}

int main()
{
	SqStack *s;
	s = (SqStack*)malloc(sizeof(SqStack));
	InitStack(s);

	for (int i = 0; i < 10; i++)
	{
		Push(s, i);
	}
	StackEmpty(s);

	int e;
	GetTop(s, e);
	printf("e=%d\n",e);

	int a[10];
	for (int i = 0; i < 10; i++)
	{
		Pop(s, a[i]);
	}
	StackEmpty(s);

	return 0;
}
二、栈的链式储存结构

规定:链栈的所有操作都是在单链表的表头进行的,因为给定链栈后,已知头结点地址,在其后面插入一个新节点和删除首节点都比较方便。

#include <stdlib.h>
#include <stdio.h>
#define MaxSize 10

//顺序栈的抽象数据类型
typedef struct linknode
{
	int data;
	struct linknode* next;
}LinkStack;

//初始化栈
void InitStack(LinkStack* &s)
{
	s = (LinkStack*)malloc(sizeof(LinkStack));
	s->next = NULL;					//创建空链栈;实际上就是创建头节点
}

//销毁栈
void DestroyStack(LinkStack *&s)
{
	LinkStack* pre = s, *p = s->next;		//和销毁单链表的算法完全相同
	while (p != NULL)
	{
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}

//判断栈是否为空
bool StackEmpty(LinkStack *s)
{
	if (s->next == NULL)
		printf("这是一个空栈\n");
	else
		printf("这不是空栈\n");
	return (s->next == NULL);			//该运算实际上用于判断条件s->next = NULL是否成立
}

//进栈
void Push(LinkStack *&s, int e)
{
	LinkStack* p;
	p = (LinkStack*)malloc(sizeof(LinkStack));	//新建节点
	p->data = e;					//存放元素
	p->next = s->next;				//将p结点插入作为首节点
	s->next = p;
}

//出栈
bool Pop(LinkStack *&s, int &e)
{
	LinkStack* p;
	p = (LinkStack*)malloc(sizeof(LinkStack));
	if (s->next == NULL)
		return false;
	p = s->next;					//p指向首节点位置
	p->data = e;					//提取首节点值
	s->next = p->next;				//删除首节点
	free(p);					//释放被删除节点的储存空间
	return true;
}

//取栈顶元素
bool Getnext(LinkStack* s, int &e)
{
	if (s->next == NULL)
		return false;
	e = s->next->data;
	return true;
}

int main()
{
	LinkStack *s;
	s = (LinkStack*)malloc(sizeof(LinkStack));
	InitStack(s);
	StackEmpty(s);

	for (int i = 0; i < 10; i++)
	{
		Push(s, i);
	}
	StackEmpty(s);

	int e;
	Getnext(s, e);
	printf("e=%d\n", e);

	int a[10];
	for (int i = 0; i < 10; i++)
	{
		Pop(s, a[i]);
	}
	StackEmpty(s);

	return 0;
}
这是两种基本栈的大致定义,基于以上方法,在后续文章整理一下应用实例吧。



猜你喜欢

转载自blog.csdn.net/qq_38055050/article/details/80556681