线性结构栈----动态实现

//函数声明:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_MEMORY 100
#define STACK_GROW_MEMORY 10
typedef int ElemType;
typedef struct stack
{
	ElemType *esp;
	ElemType *ebp;
	int size;                           //记录当前栈内空间最多能存几个元素
}stack;





//函数实现:
void creatstack(stack *S)
{
	S->ebp = (ElemType *)malloc(sizeof(ElemType)* STACK_INIT_MEMORY);
	if (S->ebp == NULL)                      //判断动态内存是否开辟成功
		exit(1);
	S->size = STACK_INIT_MEMORY;
	S->esp = S->ebp;
}
int push(stack *S, ElemType x)
{
	if (S->esp - S->ebp >= S->size)    //判断当前栈是否已满
	{                                 //栈满追加空间
		S->ebp = (ElemType *)realloc(S->ebp, sizeof(ElemType)*(S->size + STACK_GROW_MEMORY));
		if (S->ebp == NULL)
			exit(1);
		S->esp = S->ebp + S->size;              //让栈顶指针向后偏移指向要入栈的位置
		S->size += STACK_GROW_MEMORY;
	}
	*S->esp++ = x;
	return 1;
}
int pop(stack *S, ElemType *x)
{
	if (S->esp == S->ebp)
		return 0;
	else
	{
		*x = *--S->esp;
		return 1;
	}
}
int getesp(stack *S, ElemType *x)
{
	if (S->esp == S->ebp)
		return 0;
	else
	{
		*x = *(S->esp - 1);
		return 1;
	}
}
int stacklength(stack *S)
{
	return S->esp - S->ebp;
}
void destorystack(stack *S)
{
	if (S->ebp != NULL)                               //销毁栈
		free(S->ebp);
}




//函数测试:
#include"stack.h"
int main()
{
	printf("************************************\n");
	printf("*0.exit            1.creatstack    *\n");
	printf("*2.push            3.pop           *\n");
	printf("*4.getesp          5.stacklength   *\n\n\n");
	stack ret;
	ret.ebp = NULL;
	ElemType x;
	int n = 0;
	while (1)
	{
		printf("请选择功能:");
		scanf("%d", &n);
		switch (n)
		{
		case 0:
			destorystack(&ret);
			exit(1);
			break;
		case 1:
			if (ret.ebp != NULL)
			{
				destorystack(&ret);          //如果当前已经创建了一个栈,则先销毁在创建
			}                         
			creatstack(&ret);
			printf("创建成功\n");
			break;
		case 2:
			printf("请输入入栈元素:");
			scanf("%d", &x);
			push(&ret, x);
			printf("入栈成功\n");
			break;
		case 3:
			if (pop(&ret, &x) == 0)
				printf("栈是空栈!\n");
			else
				printf("弹出成功,弹出元素:%d\n", x);
			break;
		case 4:
			if (getesp(&ret,&x) == 0)
				printf("栈是空栈!\n");
			else
				printf("栈顶元素:%d\n",x);
			break;
		case 5:
			printf("栈的长度:%d\n", stacklength(&ret));
			break;
		default:
			printf("选择无效\n");
			break;
		}
	}
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值