顺序栈的基本操作实现代码_顺序栈与链栈的C实现

3fab4fa275d567c1814a1cf410fa12b6.png

顺序栈的C实现

//顺序栈的实现
//用一个结构体来实现顺序栈,用一个数组来存储栈中
//的元素,用一个整型变量top来指示栈顶部位置
#include<stdio.h>
#define stacksize 100
typedef int Datatype;
typedef struct
{
	Datatype data[stacksize];
	int top;
}seqstack;

//定义操作
//1、顺序栈初始化
void initstack(seqstack* s)
{
	s->top = -1;
}
//2、顺序栈的销毁
//顺序栈是静态存储分配,在顺序栈退出作用域时自动释放顺序栈所占存储
//单元,因此顺序栈无须销毁。

//3、入栈
int push(seqstack* s, Datatype x)
{
	if (s->top >= stacksize - 1)
	{
		printf("栈满,入栈失败");
		return 0;
	}
	else
	{
		s->top = s->top + 1;
		s->data[s->top] = x;
		return 1;
	}
}

//4、出栈
int pop(seqstack* s, Datatype* ptr)
{
	if (s->top == -1)
	{
		printf("删除失败");
		return 0;
	}
	else
	{
		*ptr = s->data[s->top];
		s->top = s->top - 1;
		return 1;
	}
}

//5、取栈顶元素
int gettop(seqstack* s, Datatype* ptr)
{
	if (s->top == -1)
	{
		printf("取栈顶失败");
		return 0;
	}
	else
	{
		*ptr = s->data[s->top];
		return 1;
	}
}

//6、判空操作
int empty(seqstack* s)
{
	if (s->top == -1)
		return 1;
	else
		return 0;
}

//顺序栈的测试
int main()
{
	Datatype x;
	seqstack s;
	initstack(&s);
	//对10,15,20入栈
	push(&s, 10);
	push(&s, 15);
	push(&s, 20);
	//出栈
	while (empty(&s)==0)
	{
		pop(&s, &x);
		printf("出栈元素为%dn", x);
	}
}

链栈的C实现

//链栈通常用单链表表示,结点结构与单链表结点结构相同。
//由于只在栈顶执行插入和删除,用单链表的头部做栈顶是
//最方便的,没有必要像单链表那样为了方便附加头结点
#include<stdio.h>
#include<malloc.h>
typedef int Datatype;
typedef struct stacknode
{
	Datatype data;
	stacknode* next;
}stacknode;

//初始化
void initstack(stacknode* top)
{
	top = NULL;
}

//链栈的销毁
void destroystack(stacknode* top) 
{
	stacknode* p = top;
	while (top != NULL)
	{
		top = top->next;
		free(p);
		p = top;
	}
}

//入栈操作
stacknode* push(stacknode* top, Datatype x)
{
	stacknode* s = (stacknode*)malloc(sizeof(stacknode));
	s->data = x;
	s->next = top;
	top = s;
	return top;
}

//出栈操作
stacknode* pop(stacknode* top, Datatype* ptr)
{
	stacknode* p = top;
	if (top == NULL)
	{
		printf("出栈失败");
	}
	else
	{
		*ptr = top->data;
		top = top->next;
		free(p);
		return top;
	}
}

//取栈顶元素
int gettop(stacknode* top, Datatype* ptr)
{
	if (top == NULL)
	{
		printf("取栈顶元素失败");
		return 0;
	}
	else
	{
		*ptr = top->data;
		return 1;
	}
}

//判空操作
int empty(stacknode* top)
{
	if (top == NULL)
		return 1;
	else
		return 0;
}

//测试链栈
void main()
{
	Datatype x;
	stacknode* top=NULL;
	//初始化链栈
	initstack(top);
	//对10,20,30入栈
	top = push(top, 10);
	top = push(top, 20);
	top = push(top, 30);
	//出栈
	while (top != NULL)
	{
		top=pop(top, &x);
		printf("%dn", x);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值