顺序栈

用数组实现顺序栈

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

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0

#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
#define OVERFLOW -2

typedef int elemType;

struct sqStack
{
	elemType * data;
	int top;
	int stacksize;
};

void initStack(sqStack &s)
{
	s.data = (elemType *)malloc(sizeof(elemType) * STACK_INIT_SIZE);
	if(!s.data)
	{
		exit(OVERFLOW);
	}

	s.top = 0;
	s.stacksize = STACK_INIT_SIZE;
}


void destroyStack(sqStack &s)
{
	free(s.data);
	s.top = 0;
	s.stacksize = 0;
}

void clearStack(sqStack &s)
{
	s.top = 0;
}

bool stackEmpty(sqStack s)
{
	if(s.top == 0)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

int stackLength(sqStack s)
{
	return s.top;
}

bool getTop(sqStack s, elemType &e)
{
	if(s.top > 0)
	{
		e = s.data[s.top - 1];
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

void push(sqStack &s, elemType e)
{
	if(s.top + 1 == s.stacksize)
	{
		s.data = (elemType *)realloc(s.data, (s.stacksize + STACK_INCREMENT) * sizeof(elemType));
		if(!s.data)
			exit(OVERFLOW);
		s.stacksize += STACK_INCREMENT;
	}
	s.data[s.top] = e;
	s.top++;
}

bool pop(sqStack &s, elemType &e)
{
	if(s.top == 0)
	{
		return FALSE;
	}
	e = s.data[--s.top];
	return TRUE;
}

void stackTraverse(sqStack s, void(* visit)(elemType))
{
	for(int i = 0; i < s.top; i++)
	{
		visit(s.data[i]);
	}
}

void visit(elemType e)
{
	printf("%d  ", e);
}

int main(void)
{
	sqStack s;
	elemType e;

	initStack(s);
	for(int i=0; i<13; i++)
	{
		push(s, i*10);
	}
	printf("The elements are:");
	stackTraverse(s, visit);
	pop(s, e);
	printf("\npop element is: %d", e);
	printf("\nif the stack is null? %d", stackEmpty(s));
	getTop(s, e);
	printf("\nstack top element is:%d, the stack length is:%d", e, stackLength(s));
	clearStack(s);
	printf("\nif the stack is null? %d", stackEmpty(s));
	destroyStack(s);
	printf("\nafter destory, s.top = %d, s.data = %u, s.stacksize = %d", s.top, s.data, s.stacksize);

	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值