大话数据结构07 :链表栈

基础介绍

用链表结构作为栈的支撑结构

代码

#include "stdio.h"    

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;
typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */

//链栈结构
typedef struct StackNode
{
	SElemType data;
	struct StackNode* next;
}StackNode, *LinkStackPtr;

typedef struct
{
	LinkStackPtr top;
	int count;
}LinkStack;

Status visit(SElemType	c)
{
	printf("%d", c);
	return OK;
}

// 构造一个空栈S
Status InitStack(LinkStack* S)
{
	if (!S->top) //如果已经初始化过
		return ERROR;
	S->top = NULL;
	S->count = 0;
	return OK;
}

//把S置为空
Status ClearStack(LinkStack* S)
{
	LinkStackPtr p;
	LinkStackPtr q;
	p = S->top;
	while (p)
	{
		q = p;
		p = p->next;
		delete q;
		S->count--;
	}
	return OK;
}

//判断是否为空栈
Status StackEmpty(LinkStack S)
{
	if (S.count == 0)
		return TRUE;
	else
	{
		return FALSE;
	}
	return TRUE;
}

//返回栈的长度
Status StackLength(LinkStack S)
{
	return S.count;
}

//返回栈顶元素
const Status GetTop(LinkStack *S, SElemType* e)
{
	if ((*S).top == NULL)
		return ERROR;
	else
	{
		*e = (*S).top->data;
	}
	return OK;
}

//插入元素e为新的栈顶元素
Status Push(LinkStack* S, SElemType e)
{
	LinkStackPtr n = new StackNode();
	n->data = e; 

	//当前元素作为顶元素
	n->next = (*S).top; 
	(*S).top = n;

	//元素数目加1
	S->count++;

	return OK;
}

//若栈不为空 则删除S的栈顶元素
Status Pop(LinkStack* S, SElemType* e)
{
	if (!S->top)
		return ERROR;
	else
	{
		//返回栈顶元素的值
		(*e) = S->top->data;

		//栈顶元素后移
		LinkStackPtr q = S->top;
		S->top = S->top->next;

		//删除栈顶元素
		delete q;

		S->count--;
	}
	return OK;
}

//遍历栈
Status StackTraverse(LinkStack* S)
{
	LinkStackPtr p;
	p = S->top;
	while (p)
	{
		visit(p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}
int main()
{
	int j;
	LinkStack s;
	int e;
	if (InitStack(&s) == OK)
		for (j = 1; j <= 10; j++)
			Push(&s, j);
	printf("栈中元素依次为:");
	StackTraverse(&s);

	Pop(&s, &e);
	printf("弹出的栈顶元素 e=%d\n", e);

	printf("栈空否:%d(1:空 0:否)\n", StackEmpty(s));
	GetTop(&s, &e);

	printf("栈顶元素 e=%d 栈的长度为%d\n", e, StackLength(s));
	ClearStack(&s);

	printf("清空栈后,栈空否:%d(1:空 0:否)\n", StackEmpty(s));
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值