(C语言描述)什么是链栈?链栈的基本操作

栈一共有两种储存结构

1.顺序栈
2.链栈

链栈

链栈也是一种链表,它与一般链表的不同之处就在于仅仅只在表尾插入/输出。
所以我们定义一个结点,结点包含value储存要保存的数值,指针next,指向一下个结点。
定义一个链表,包含top指针,指向最后输入的那个元素;还需要指针bottom,始终指向栈底;还可设置一个变量len,用来储存栈内元素的个数,当然不设置也可以,写一个GetLength()也可。

定义一个结点
typedef struct SNode {
     
	ElemType value;
	struct SNode *next;
}*SNode;
定义一个顺序栈
typedef struct Stack {
     
	SNode top;
	SNode bottom;
	int len;
}*Stack;
基本操作

初始化栈
判空
输出栈
入栈
出栈
输出栈中元素个数
输出栈顶元素

//初始化链栈
void InitStack(Stack S)
{
     
	S->top = (SNode)malloc(sizeof(SNode));
	S->bottom = (SNode)malloc(sizeof(SNode));
	S->top->next= NULL;
	S->bottom = S->top;
	S->len = 0;
}

//判空
bool IsEmpty(Stack S)
{
     
	if (S->len == 0)
		return true;
	else
		return false;
}

//输出链栈
void show(Stack S)
{
     
	if (IsEmpty(S))
		printf("该栈为空\n");
	else
	{
     
		SNode p = (SNode)malloc(sizeof(SNode));
		p = S->top;
		while (p)
		{
     
			printf("输出的元素为:%d\n", p->value);
			p = p->next;
		}
	}
}

//入栈
void Push(Stack S, ElemType x)
{
     
	SNode node = (SNode)malloc(sizeof(SNode));
	node->value = x;
	if (S->top == S->bottom)
	{
     
		S->top = node;
		node->next = NULL;
	}
	else
	{
     	
		node->next = S->top;
		S->top = node;
	}
	S->len++;
}

//出栈
void Pop(Stack S)
{
     
	if (IsEmpty(S))
		printf("此栈为空\n");
	else
	{
     
		printf("栈顶元素为:%d\n", S->top->value);
		S->top = S->top->next;
		S->len--;
	}
}

//输出栈中元素个数
void GetStackSize(Stack S)
{
     
	printf("一共有%d个元素\n", S->len);
}

//返回栈顶元素
void GetFirstElem(Stack S)
{
     
	if (IsEmpty(S))
		printf("此栈为空\n");
	else
		printf("栈顶元素为:%d\n", S->top->value);
}

测试一下
测试代码:

InitStack(S);
	for (int i = 0; i < 5; i++)
		Push(S, i);
	Pop(S);
	GetStackSize(S);
	show(S);

结果:
(C语言描述)什么是链栈?链栈的基本操作_第1张图片

你可能感兴趣的:(数据结构,链表,数据结构,c语言)