C 基础数据结构---栈 ADT

6 篇文章 0 订阅
4 篇文章 0 订阅

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

#define MAX_SIZE 20

/*
*	使用ADT实现栈模型的出栈和入栈
*	函数中返回值 -1 表示失败, 0 表示成功
*    
*/
typedef struct NODE {
	int data;
	struct NODE *pre;
}*Node;

typedef struct STACK {
	int size;
	struct NODE *top;
}*Stack;

Stack CreatEmptyStack()
{
	Stack stack = NULL;
	stack = (Stack)malloc(sizeof(struct STACK));
	if(stack == NULL){
		printf("malloc mem error !\n");
		exit(-1);
	}
	stack->top = NULL;
	stack->size = 0;
	return stack;
}

int isStackEmpty(Stack stack)
{
	assert(stack!=NULL);
	return (stack->top ==NULL);
}
int isStackFull(Stack stack)
{
	assert(stack!=NULL);
	return (stack->size >= MAX_SIZE);
}
int Push(Stack stack,int data)
{
	assert(stack!=NULL);
	Node p = NULL;
	if(isStackFull(stack)){
		printf("The stack is full ! \n");
		return -1;
	}
	p = (Node)malloc(sizeof(struct NODE));
	if(p == NULL)
	{
		printf("push malloc mem error !\n");
		return -1;
	}
	p->data = data;
	p->pre = NULL;
	p->pre = stack->top;
	stack->top = p;
	(stack->size) ++;
	return 0;
}

int Pop(Stack stack , int* data)
{	
	assert(stack!=NULL && data != NULL);
	if(isStackEmpty(stack) == 1){
		printf("The stack is empty!\n");
		return -1;
	}
	Node p ;
	p = stack->top;
	*data = p->data;
	stack->top = p->pre;
	(stack->size) --;
	free(p);
	p = NULL;
	return 0;
}

int getTop(Stack stack,int *data)
{
	assert(stack!=NULL && data != NULL);
	if(isStackEmpty(stack)==1){
		printf("The stack is empty!\n");
		return -1;
	}
	*data = stack->top->data;
	return 0;
}

void printStack(Stack stack)
{	
	assert(stack!=NULL);
	if(isStackEmpty(stack)==1){
		printf("The stack is empty!\n");
		return ;
	}
	Node p = stack->top;
	while(p!=NULL){
		printf(" %d ",p->data);
		p = p->pre;
	}
	printf("\n");
}

void destory(Stack stack)
{
	assert(stack!=NULL);
	Node p,q;
	if(isStackEmpty(stack)!=1){
		p = q = stack->top;
		while(p != NULL){
			q = p->pre;
			free(p);
			p = q;
		}
	}
	free(stack);
	return ;

}

int main(int argc ,char *argv[])
{
	printf("Enter hash main !\n");
	Stack  stack = NULL;
	int i,data,ret;
	stack = CreatEmptyStack();
	for(i=0;i<50;i++){
		Push(stack,i*5);
	}
	ret = getTop(stack,&data);
	if(ret == -1){
		printf("get data error !\n");
	}else{
		printf("get top data %d \n",data);
	}
	
	ret = Pop(stack ,&data);
	if(ret == -1){
		printf("get data error !\n");
	}else{
		printf("pop top data %d \n",data);
	}
	
	printStack(stack);
}

目的很明显,给自己做一个记录,代码在ubuntu上编译通过。代码中会有一些我没有考虑到的内容,请指出,


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值