数据结构:堆栈的实现(c语言)含判断以in[]顺序进栈,能否以out[]顺序出栈;

数据结构:堆栈的实现(c语言)

stack.h

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

typedef int T;
typedef struct Stack{
	T *base;          //内存
	size_t cap;       //容量
	size_t size;      //元素个数
}Stack;

int stack_init(Stack *s,size_t cap);//初始化一个栈
void stack_destroy(Stack *s);销毁栈
bool stack_is_empty(Stack *s);//栈是否为空
bool stack_is_full(Stack *s);//栈是否为满
void stack_push(Stack *s,T data);//压入一个元素
void stack_clear(Stack *s);//清空栈
T stack_pop(Stack *s);//弹出栈顶元素
T stack_top(Stack *s);//查看栈顶元素
void stack_foreach(Stack *s,void (*foreach)(T));//遍历
bool is_stack_out(T in[],T out[],size_t n);//判断以in[]顺序进栈,能否以out[]顺序出栈;
#endif //_STACK_H__

stack.c

#include "stack.h"

int stack_init(Stack *s,size_t cap){
	s->base = calloc(cap,sizeof(T));
	s->cap = cap;
	s->size = 0;
}
void stack_destroy(Stack *s){
	if(s->base)
		free(s->base);
	s->base = NULL;
}
bool stack_is_empty(Stack *s){
	return s->size == 0;	
}
bool stack_is_full(Stack *s){
	return s->size == s->cap;	
}
void stack_clear(Stack *s){
	s->size = 0;	
}
void stack_push(Stack *s,T data){
	s->base[s->size++] = data;	
}
T stack_pop(Stack *s){
	return s->base[--s->size];	
}
T stack_top(Stack *s){
	return s->base[s->size-1];	
}
void stack_foreach(Stack *s,void (*foreach)(T)){
	int i;
	for(i=0;i<s->size;i++){
		foreach(s->base[i]);	
	}
}
bool is_stack_out(T in[],T out[],size_t n){
	Stack s;
	stack_init(&s,n);
	int i=0,j=0;
	for(i=0;i<n;i++){
		stack_push(&s,in[i]);//压一个元素到栈里面
		while((!stack_is_empty(&s))&&stack_top(&s)==out[j]){
			stack_pop(&s);
			++j;
		}
	}
	bool ret = stack_is_empty(&s);
	stack_destroy(&s);
	return ret;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值