C 栈


```c

// 顺序栈 

#ifndef _STACK_H_
#define _STACK_H_
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef  int datatype;

//先进后出
typedef struct {

	datatype *data;
	int maxlen;//栈容量  
	int top;//指向栈顶元素的下标  初始化 为 -1 表示无元素或空栈

}sqstack;
extern sqstack * CreateStack(int len);//创建
extern int  EmptyStack(sqstack *s);//判空
extern int  FullStack(sqstack *s);//判满
extern void ClearStack(sqstack *s);//清空

extern int  PushStack(sqstack *s,datatype data);//进栈
extern int PopStack(sqstack *s);//出栈 返回值为出栈元素
extern datatype TopStack(sqstack *s);//获取栈顶位置
extern void DeleteStack(sqstack *s);//删除栈

extern void ShowStack(sqstack *s);//栈遍历

#endif


#include"stack.h"

sqstack * CreateStack(int len)//创建
{
	sqstack  *s = NULL; 
	if((s = (sqstack *)malloc(sizeof(sqstack))) ==NULL)
	{
		printf("malloc fail\n");
		return NULL;
	}
	if((s->data = (datatype *)malloc(sizeof(datatype) * len)) == NULL)
	{
		printf("malloc fail\n");
		return NULL;
	}
	s->maxlen = len ;//栈容量
	s->top = -1;//-1 表示空栈
		return s;
}
int EmptyStack(sqstack *s)//判空
{
	return (s->top == -1? 1:0) ;
}
int FullStack(sqstack *s)//判满
{
	return ((s->top == s->maxlen-1) ? 1:0);
}
void ClearStack(sqstack *s)//清空
{
		s->top = -1;
}

int PushStack(sqstack *s,datatype data)//进栈
{
	if(FullStack(s))
	{
		printf("满栈\n");
		return 0;
	}
		s->top = s->top+1;//栈顶上移
		s->data[s->top] =  data;//放入数据
		return 1;
}
int PopStack(sqstack *s)//出栈
{
	if(EmptyStack(s))
	{
		printf("空栈\n");
		return 0;
	}
		s->top = s->top-1;//栈顶下移
	return (s->data[s->top+1]);//放入数据


}
datatype TopStack(sqstack *s)//获取栈顶位置
{
	return s->top;
}
void DeleteStack(sqstack *s)//删除栈
{
	free(s);
	s = NULL;

}

void ShowStack(sqstack *s)//栈遍历 从下往上 
{
	if(EmptyStack(s))
	{
		printf("空栈\n");
		return ;
	}
	int i ;
	for(i = 0 ;i<= s->top;i++)
		printf("%3d",s->data[i]);
		putchar(10);

}




//链式栈
```c
#ifndef _STACK_H_
#define _STACK_H_
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef  int datatype;

//先进后出
typedef struct  sqst{ 

	datatype data;
	struct  sqst* next;

}sqstack;
extern sqstack * CreateStack();//创建
extern int  EmptyStack(sqstack *s);//判空

extern int  PushStack(sqstack *s,datatype data);//进栈
extern int PopStack(sqstack *s,int  *D);//出栈 返回值为出栈元素
extern datatype TopStack(sqstack *s);//获取栈顶位置
extern void DeleteStack(sqstack *s);//删除栈

extern void ShowStack(sqstack *s);//栈遍历

#endif


#include"stack.h"
sqstack * CreateStack()//创建
{
	sqstack  *s = NULL; //s->next 是指向栈底的指针
	if((s = (sqstack *)malloc(sizeof(sqstack))) ==NULL)
	{
		printf("malloc fail\n");
		return NULL;
	}
	s->next = NULL;//指向栈顶 的数
		return s;
}
int EmptyStack(sqstack *s)//判空
{
	return (s->next == NULL? 1:0) ;
}
void DeleteStack(sqstack *s)//删除栈
{
	sqstack *p = s->next ;
		while(p)//s 是 头  栈底 是 next为null的时候
		{
			s->next = p->next;
			free(p);
			p = s->next;
		}
		if(s->next == NULL)
		{
		free(s);
		printf("delete success\n");
		}
}
int PushStack(sqstack *s,datatype data)//进栈
{
	sqstack *new = (sqstack*)malloc(sizeof(sqstack));
		new->next = NULL;
		new->data =  data;
		//头插 s->next 为null 表示链表为空

		new->next = s->next;
		 s->next  = new;
		return 1;
}
int PopStack(sqstack *s,datatype *D)//出栈
{
	if(EmptyStack(s))
	{
		printf("空栈\n");
		return 0;
	}
		sqstack *q;
		q = s->next;//s->next 指向栈顶
		*D = q->data;
		
		s->next  = q->next;
		free(q);
		q= NULL;
	return 1;//放入数据
}

void ShowStack(sqstack *s)//栈遍历
{
if (EmptyStack(s))//判空
{
	printf("empty\n");
}
	sqstack *q = s->next;
	while(q)
	{
		printf("%5d",q->data);
		q = q->next;
	}
	putchar(10);
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值