Stack.h
#ifndef _STACK_H__
#define _STACK_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int T;
//#define N 10
typedef struct Stack{
T* m_vect; //存储元素内存空间
size_t size; //堆栈总容量
size_t index;//堆栈中已经存储元素的个数
//T m_vect[N];
}Stack;
//初始化堆栈 申请动态内存
void init(Stack *stack,size_t size);
//把data这个元素放到堆栈中去
void push(Stack *stack,T data);
//从堆栈中取到一个元素 该元素是最后放到堆栈中那个元素
T pop(Stack *stack);
//查看堆栈顶的元素 并不拿走
T peek(Stack *stack);
//堆栈是否为空
bool isEmpty(Stack *stack);
//堆栈中存储元素的个数
size_t getCnt(Stack *stack);
//堆栈中容量的大小
size_t getSize(Stack *stack);
//堆栈是否已经满了
bool isFull(Stack *stack);
//清空堆栈
void clear(Stack *stack);
//销毁堆栈
void destroy(Stack *stack);
//遍历一下堆栈中的元素
void travel(Stack *stack);
bool isOutOfStack(T arr[],T brr[],size_t len);
#endif //_STACK_H__
Stack.c
#include "stack.h"
/*
typedef int T;
//#define N 10
//类型
typedef struct Stack{
T* m_vect; //存储元素内存空间
size_t size; //堆栈总容量
size_t index;//堆栈中已经存储元素的个数
//T m_vect[N];
}Stack;
*/
//初始化堆栈 申请动态内存
void init(Stack *stack,size_t size){
stack->m_vect = calloc(size,sizeof(T));
stack->size = size;
stack->index = 0;
}
//把data这个元素放到堆栈中去
void push(Stack *stack,T data){
stack->m_vect[stack->index] = data;
stack->index++;
}
//从堆栈中取到一个元素 该元素是最后放到堆栈中那个元素
T pop(Stack *stack){
return stack->m_vect[--stack->index];
}
//查看堆栈顶的元素 并不拿走
T peek(Stack *stack){
return stack->m_vect[stack->index-1];
}
//堆栈是否为空
bool isEmpty(Stack *stack){
/*if(stack->index == 0){
return true;
}else{
return false;
}*/
return stack->index == 0;
}
//堆栈中存储元素的个数
size_t getCnt(Stack *stack){
return stack->index;
}
//堆栈中容量的大小
size_t getSize(Stack *stack){
return stack->size;
}
//堆栈是否已经满了
bool isFull(Stack *stack){
return stack->size == stack->index;
}
//销毁堆栈
void destroy(Stack *stack){
if(stack->m_vect != NULL){
free(stack->m_vect);
stack->m_vect = NULL;
}
}
//清空堆栈中的元素
void clear(Stack *stack){
while(!isEmpty(stack)){
pop(stack);
}
}
//遍历一下堆栈中的元素
void travel(Stack *stack){
for(int i=0;i<stack->index;i++){
printf("%d ",stack->m_vect[i]);
}
printf("\n");
}
//判断brr是否是arr作为入栈的出栈顺序
bool isOutOfStack(T arr[],T brr[],size_t len){
Stack s;
init(&s,len);
int j = 0;//记录brr[]数组下标位置
for(int i=0;i<len;i++){
push(&s,arr[i]);//把入栈元素依次入栈
while(!isEmpty(&s) && peek(&s)==brr[j]){//一旦栈顶元素等于出栈元素
pop(&s);//出栈
j++; //下一个出栈元素
}
}
bool flag = isEmpty(&s);//栈里面元素全部都出列了
destroy(&s);
return flag;
}
Test.c
#include “stack.h”
int main(){
Stack s;
init(&s,10);
push(&s,5);
push(&s,3);
push(&s,2);
int x = pop(&s);
printf("%d\n",x);
x = pop(&s);
printf("%d\n",x);
push(&s,10);
x = pop(&s);
printf("%d\n",x);
destroy(&s);
int arr[5] = {1,2,3,4,5};
int brr[5] = {5,4,3,1,2};
if(isOutOfStack(arr,brr,5)){
printf("是\n");
}else{
printf("否\n");
}
return 0;
}
本文详细介绍了一种基于动态内存分配的栈数据结构实现方法,包括初始化、压栈、弹栈等核心操作,并通过示例代码展示了如何使用该栈结构进行元素的存储与检索。此外,还提供了一个具体的应用场景——判断一组数据是否符合特定的出入栈顺序。
2046

被折叠的 条评论
为什么被折叠?



