顺序栈,链表栈

栈符合先进后出的原则;
顺序栈顺序表的尾插头删;
链表栈单链表的头插头删;
一,顺序栈

#pragma once
typedef int Elemtype;
//顺序表的尾插形成了顺序栈
typedef struct Stack
{
	Elemtype* base;
	int top;
	int stacksize;
}Stack,*Pstack;
//初始化函数(相当于顺序表的尾插)
void Init(Stack*plist);

//入栈
bool Push(Stack* plist,Elemtype *val);

//出栈(出栈的话需要告诉出栈的值)
bool pop(Stack* plist, Elemtype* rval);

//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval);

//获取有效数据个数
int Get_length(Stack* plist);

//判空
bool Is_empty(Stack* plist);

//判满
bool Is_full(Stack*plist);

//扩容函数
bool Inc(Stack* plist);

//清空
void Clear(Stack*plist);


//销毁
void Destory(Stack* plist);

//打印
void Show(Stack*plist);

.cpp文件

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"stack.h"
#define cursize 10
#define multiple 1.5
//初始化函数(相当于顺序表的尾插)
void Init(Stack* plist)
{
	assert(plist!=nullptr);
	plist->base = (Elemtype*)malloc(sizeof(Elemtype) * cursize);
	assert(plist->base!=nullptr);
	plist->top = 0;
	plist->stacksize = cursize;
}
//入栈
bool Push(Stack* plist, Elemtype val)
{
	assert(plist != nullptr);
	if (Is_full(plist) && !Inc(plist))
	{
		return false;
	}
	plist->base[plist->top++] =val;
	return true;
}
//出栈(出栈的话需要告诉出栈的值)
bool pop(Stack* plist, Elemtype* rval)
{
	Is_empty(plist);
	*rval = plist->base[--plist->top];
	return true;
}

//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval)
{
	*rval = plist->base[plist->top - 1];
	return true;
}
//获取有效数据个数
int Get_length(Stack* plist)
{
	return plist->top;
}
//判空
bool Is_empty(Stack* plist)
{
	return plist->top == 0;
}
//判满
bool Is_full(Stack* plist)
{
	assert(plist!=nullptr);
	return plist->top>=plist->stacksize;
}
//扩容函数
bool Inc(Stack* plist)
{
	int size = plist->stacksize * multiple;
	Elemtype* newbase = (Elemtype*)realloc(plist->base,sizeof(Elemtype)* size);
	if (nullptr == newbase) return false;
	plist->base = newbase;
	plist->stacksize = size;
}

//清空
void Clear(Stack* plist)
{
	plist->top = 0;
}
//销毁
void Destory(Stack* plist)
{
	plist->top = 0;
	free(plist->base);
	plist->base = nullptr;
}
//打印
void Show(Stack* plist)
{
	for (int i = 0; i < plist->top; i++)
	{
		printf("%d ", plist->base[i]);
	}
	printf("\n");
}
int main()
{
	Stack a;
	Init(&a);
	
	for (int i = 0; i < 12; i++)
	{
		Push(&a,i + 1);
	}
	Show(&a);
	Elemtype rval;
	Top(&a, &rval);
	printf("%d\n",rval);
	pop(&a,&rval);
	printf("%d\n", rval);
	Show(&a);
	Top(&a, &rval);
	printf("%d\n", rval);
	return 0;
}

2,
二,链表栈

1,头文件

#pragma once
typedef int Elemtype;
typedef struct Lstack
{
	Elemtype data;
	struct Lstack* next;
}Stack,*Pstack;
//初始化函数(相当于顺序表的尾插)
void Init(Stack* plist);

//入栈(出栈的话需要告诉出栈的值)
bool Push(Stack* plist, Elemtype* val);

//出栈
bool pop(Stack* plist, Elemtype* rval);

//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval);

//获取有效数据个数
int Get_length(Stack* plist);

//判空
bool Is_empty(Stack* plist);

//判满
bool Is_full(Stack* plist);


//清空
void Clear(Stack* plist);


//销毁
void Destory(Stack* plist);

//打印
void Show(Stack* plist);

.p文件

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"lstack.h"
Stack* Buynode()
{
	return (Stack*)malloc(sizeof(Stack));
}
//初始化函数(相当于顺序表的尾插)
void Init(Stack* plist)
{
	//plist= Buynode();
	plist->next = nullptr;
	plist->data =0;
	printf("%d\n", plist->data);
}
//入栈
bool Push(Stack* plist, Elemtype val)
{
	assert(plist != nullptr);
	Stack* s = Buynode();
	if (s == nullptr) return false;
	s->data = val;
	s->next = plist->next;
	plist->next = s;
	plist->data+=1;
	printf("入栈成功plist->data%d\n",plist->data);
	return true;
}
//出栈(出栈的话需要告诉出栈的值)
bool pop(Stack* plist, Elemtype* rval)
{
	assert(plist!=nullptr);
	if (Is_empty(plist)) return false;
	*rval = plist->next->data;
	Stack* p = plist->next;
	plist->next = p->next;
	free(p);
	p =nullptr;
	plist->data -= 1;
	return false;
}
//获取栈顶元素
bool Top(Stack* plist, Elemtype* rval)
{
	assert(plist!=nullptr);
	if (Is_empty(plist)) return false;
	*rval = plist->next->data;
	return true;
}

//获取有效数据个数
int Get_length(Stack* plist)
{
	assert(plist!=nullptr);
	return plist->data;
}
//判空
bool Is_empty(Stack* plist)
{
	assert(plist != nullptr);
	return plist->next==NULL;
}
//清空
void Clear(Stack* plist)
{
	assert(plist != nullptr);
	plist->data = 0;
	plist->next = nullptr;
}
//销毁
void Destory(Stack* plist)
{
	assert(plist != nullptr);
	while (plist->data != 0)
	{
		Stack* p = plist->next;
		plist->next = p->next;
		free(p);
		p = nullptr;
		plist->data -= 1;
	}
}
//打印
void Show(Stack * plist)
{
	assert(plist != nullptr);
	Stack* s = plist->next;
	for (s; s != nullptr; s = s->next)
	{
		printf("%d ",s->data);
	}
	printf("\n");
}
int main()
{  
	Stack a;
	Init(&a);
	for (int i = 0; i <5; i++)
	{
		Push(&a,i+1);
	}
	Show(&a);
	int b = 0;
	Top(&a, &b);
	printf("%d\n",b);
	pop(&a, &b);
	printf("%d\n", b);
	int length = Get_length(&a);
	printf("%d\n",length);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值