栈ADT+实现

目录

ADT

代码

 顺序栈

链式栈


仅在队尾进行插入或删除操作的线性表【后进后出的线性表】

栈顶(Top):线性表表尾

栈底(Base):线性表表头

ADT

ADT Stack
{
    数据对象:D = {ai|ai∈ElemSet,i = 1,2,...,n, n>= 0}
    数据关系:R1 = {<ai-1,ai>|ai-1,ai∈D,i = 2,...,n}
            约定an端为栈顶,ai端为栈底
    基本操作:
    InitStack(&S);
    操作结果:构造一个空栈
    DestoryStack(&S);
    初始条件:栈S已存在
    操作结果:栈S被销毁
    ClearStack(&S)
    初始条件:栈S已存在
    操作结果:栈S清为空
    StackEmpty(S);
    初始条件:栈S已存在
    操作结果:若栈S为空栈,则返回TRUE,否则返回FALSE
    StackLength(&S)
    初始条件:栈S已存在
    操作结果:返回S元素的个数,即栈的长度
    GetTop(S,&e);
    初始条件:栈S已存在且非空
    操作结果:用e返回栈顶的元素
    Push(&S,e);
    初始条件:栈S已存在
    操作结果:插入元素e为新的栈顶元素
    Pop(&S,&e)
    初始条件:栈S已存在且非空
    操作结果:删除S的栈顶元素,并用e返回其值
    StackTraverse(S,visit());
    初始条件:栈已存在且非空
    操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit          
}ADT Satck;

代码

 顺序栈

// 顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指向栈顶元素在顺序栈中的元素
//数组栈:固定栈的最大元素数量,栈底用索引为0的表示
/*
struct stack
{
char data[100];
int top;
}s;
*/

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

# define STACK_INIT_SIZE 100//存储空间的初始分配
# define STACKINCERMENT 10//存储空间分配增量
# define SElemType int
# define Status int
# define OK 1
# define ERROR 0
# define TRUE 1
# define FALSE 0
# define END 0
# define OVERFLOW -1

typedef struct
{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

//初始化
Status InitStack(SqStack *s)
{
	s->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!s)
	{
		printf("内存分配失败!\n");
		exit(OVERFLOW);
	}

	s->top = s->base;
	s->stacksize = STACK_INIT_SIZE;

	return OK;
}

//销毁栈
Status DestoryStack(SqStack *s)
{
	if (!s)
	{
		printf("栈不存在\n");
		return ERROR;
	}

	int len = s->stacksize,i;
	for (i = 0; i < len; ++i)
	{
		free(s->base);
		s->base++;
	}

	s->base = s->top = NULL;
	s->stacksize = 0;
	
	return OK;
}

//判断栈是否为空
Status StackEmpty(SqStack s)
{
	if (!&s)
	{
		printf("栈不存在!\n");
		return ERROR;
	}
	if (s.top == s.base)
		return TRUE;
	else
		return FALSE;
}

//获取栈长度
Status StackLength(SqStack s)
{
	if (!&s)
	{
		printf("栈不存在!\n");
		return ERROR;
	}
	if (StackEmpty(s))
	{
		return 0;
	}

	SElemType *cur = s.base;
	int count = 0;
	while (cur != s.top)
	{
		count++;
		cur++;
	}

	return count;
}

//清空栈
Status ClearStack(SqStack *s)
{
	if (!s)
	{
		printf("栈不存在!\n");
		return ERROR;
	}

	s->top = s->base;

	return OK;
}

//压栈
Status Push(SqStack *s,SElemType e)
{
	//判断栈满
	if (s->top - s->base == s->stacksize)
	{
		s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCERMENT) * sizeof(SElemType));
		if (!s)
		{
			printf("内存分配失败!\n");
			exit(OVERFLOW);
		}

		s->top = s->base + s->stacksize;
		s->stacksize += STACKINCERMENT;
	}

	*(s->top) = e;
	s->top++;

	return OK;
}

//出栈
Status Pop(SqStack *s, SElemType *e)
{
	if (StackEmpty(*s))
	{
		printf("空栈\n");
		return ERROR;
	}

	*e = *--s->top;

	return OK;
}

//获取栈顶元素
Status GetTop(SqStack s, SElemType *e)
{
	if (s.top == s.base)
	{
		printf("空栈!\n");
		return ERROR;
	}

	*e = *(s.top - 1);

	return OK;
}

//访问函数
Status visit(SElemType e)
{
	printf("%d ",e);

	return OK;
}

//遍历栈
Status StackTraverse(SqStack s, Status(*visit)(SElemType e))
{
	if (!&s)
	{
		printf("栈不存在!\n");
		return ERROR;
	}

	if (StackEmpty(s))
	{
		printf("栈为空!\n");
		return ERROR;
	}
	SElemType *cur = s.base;

	while (cur != s.top)
	{
		visit(*cur);

		cur++;
	}
	printf("\n");

	return OK;
}

int main()
{
	SqStack stack;
	SElemType data;
	int n,i;

	InitStack(&stack);
	printf("输入压栈次数:\n");
	scanf_s("%d", &n);
	printf("输入栈中数据元素:\n");
	for (i = 1; i <= n; ++i)
	{
		scanf_s("%d", &data);
		Push(&stack, data);
	}
	printf("遍历栈:\n");
	StackTraverse(stack, visit);

	/*
	if (DestoryStack(&stack))
	printf("OK\n");
	printf("弹出栈顶元素为:\n");
	Pop(&stack, &data);
	printf("%d\n",data);
	printf("栈中元素数量为:%d\n", StackLength(stack));
	GetTop(stack, &data);
	printf("栈顶元素是:%d\n",data);
	*/
    return 0;
}

链式栈

// 链式栈.cpp : 定义控制台应用程序的入口点。
//单链表实现栈

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

# define SElemType int
# define Status int
# define OK 1
# define FALSE 0
# define OVERFLOW -1
# define TRUE 1
# define ERROR 0

typedef struct LNode
{
	SElemType data;
	struct LNode *next;
}SNode, *SqStack;

//初始化栈
Status InitStack(SqStack *s)
{
	SNode *head = (SNode *)malloc(1 * sizeof(SNode));
	head->next = NULL;
	if (!head)
	{
		printf("内存分配失败!\n");
		return ERROR;
	}
	*s = head;

	return OK;
}

//清空栈
Status ClearStack(SqStack *s)
{
	SNode *p, *q;

	p = (*s)->next;

	while (p)
	{
		q = p->next;
		free(p);
		p = q;
	}

	return OK;
}

//销毁栈
Status DestoryStack(SqStack *s)
{
	if (!(*s))
	{
		printf("栈不存在!\n");
		return ERROR;
	}

	ClearStack(s);

	free(*s);

	return OK;
}

//获取栈中元素数量
Status LengthStack(SqStack s)
{
	int len = 0;

	SNode *target = s->next;

	while (target)
	{
		len++;
		target = target->next;
	}

	return len;
}

//判断空栈
Status EmptyStack(SqStack s)
{
	if (s->next == NULL)
		return TRUE;
	else
		return FALSE;
}

//压栈(头插法)
Status push(SqStack *s, SElemType data)
{
	SNode *node = (SNode *)malloc(1 * sizeof(SNode));

	node->data = data;
	node->next = (*s)->next;
	(*s)->next = node;

	return OK;
}

//弹出栈
Status pop(SqStack *s, SElemType *data)
{
	if (EmptyStack(*s))
	{
		printf("空栈\n");
		return ERROR;
	}

	SNode *p = (SNode *)malloc(1 * sizeof(SNode));

	p = (*s)->next;
	(*s)->next = p->next;
	*data = p->data;
	free(p);

	return OK;
}

//访问函数
Status visit(SElemType e)
{
	printf("%d ",e);

	return OK;
}

//遍历栈
Status TraverseStack(SqStack s,Status (*visit)(SElemType e))
{
	if (!s)
	{
		printf("栈不存在!\n");
		return ERROR;
	}

	if (EmptyStack(s))
	{
		printf("空栈!\n");
		return ERROR;
	}

	SNode *target = s->next;
	for (; target; target = target->next)
	{
		visit(target->data);
	}

	return OK;
}

//返回栈顶元素
Status GetTop(SqStack s,SElemType *e)
{
	if (!s)
	{
		printf("栈不存在!\n");
		return ERROR;
	}

	if (EmptyStack(s))
	{
		printf("空栈\n");
		return ERROR;
	}

	*e = s->next->data;

	return OK;
}

int main()
{
	SqStack stack;
	int n;
	SElemType data;

	InitStack(&stack);

	printf("输入栈的元素个数:");
	scanf_s("%d", &n);
	while (n--)
	{
		scanf_s("%d",&data);
		push(&stack, data);
	}
	
	printf("遍历栈\n");
	TraverseStack(stack, visit);

	DestoryStack(&stack);

	/*
	pop(&stack, &data);
	printf("删除的元素是:%d\n",data);
	printf("遍历栈\n");
	TraverseStack(stack, visit);
	GetTop(stack, &data);
	printf("栈顶元素为:%d\n",data);
	//printf("栈元素个数为:%d\n",LengthStack(stack));
	*/

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosTian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值