数据结构:静态栈与动态栈的实现

#pragma once
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
#define MAX_SIZE 100

typedef struct Stack
{
	DataType _arr[MAX_SIZE];//栈的元素最大个数
	int _top;//栈顶
	int _bottom;//栈低
	int len;//栈大小
}Stack,*Pstack;

// 栈的初始化 
void StackInit(Stack* s); 

// 入栈 
void StackPush(Stack* s, DataType data); 

// 出栈 
void StackPop(Stack* s); 

// 获取栈顶元素 
DataType StackTop(Stack* s); 

// 获取栈中元素个数 
int StackSize(Stack* s); 

// 检测栈是否为空 
int StackEmpty(Stack* s);

 test

#include"Stack.h"
void StackInit(Stack* S)
{
	S->_bottom = S->_top = 0;
	S->len = 0;
}

void StackPush(Stack* S, DataType data)
{
	if(S->len == MAX_SIZE)
	{
	printf("栈满溢出,添加失败!\n");
	return;
	}
	S->_top++;
	S->_arr[S->_top] = data;
	S->len++;
	printf(" %d 入栈成功!\n",data);
}

void StackPop(Stack* S)
{
	if(S->len == 0)
	{
	printf("栈为空!\n");
	return;
	}
	printf(" %d 出栈\n",S->_arr[S->_top]);
	S->_top--;
	S->len--;
	printf("此时栈顶元素为:%d\n",S->_arr[S->_top]);
}

DataType StackTop(Stack* S)
{
   if(S->len == 0)
	{
	printf("栈为空!\n");
	return;
	}
    printf("此时栈顶为: %d \n",S->_arr[S->_top]);
}

int StackSize(Stack* S)
{
	int ret = 0;
	ret = printf("栈中元素个数为:%d\n",S->len);
	return ret;
}

int StackEmpty(Stack* S)
{
   if(S->len == 0 )
	{
	printf("栈为空!\n");
	return 1;
	}
   else
   {
   printf("栈不为空!\n");
   return 0;
   }
}
main

#include"Stack.h"
test()
{
  Stack S;
  StackInit(&S);
  StackPush(&S, 1);
  StackPush(&S, 2);
  StackPush(&S, 3);
  StackPush(&S, 4);
  StackPush(&S, 5);
  StackSize(&S);
  StackTop(&S);
  StackPop(&S);
  StackPop(&S);
  StackEmpty(&S);



}
int main()
{
	test();
	system("pause");
}

动态栈

Stack.c

#include "stack.h"  
#include "Maze.h"  
  
void StackInit(Stack *S,int capacity)//栈初始化  
{  
    S->arr = (DataType*)malloc(capacity*sizeof(DataType));  
    if(NULL == S->arr)  
    {  
       printf("申请空间失败!\n");  
       return;  
    }  
    S->capacity = capacity;  
    S->size = 0;  
}  
  
  
void AddCapacity(Stack *S)//扩容  
{  
   if(NULL == S->arr)  
    {  
       printf("扩容失败\n");  
       return;  
    }  
   S->capacity = (DataType*)realloc(S->arr,sizeof(DataType)*(S->capacity)*2);//扩容为原来的二倍  
   if (NULL == S->arr)  
    {  
        printf("空间扩增失败!!!\n");  
        return;  
    }  
   S->capacity =2 * (S->capacity);  
}  
  
void PrintfStack(Stack *S)//打印栈  
{  
   int i = 0;  
   if(NULL == S->arr)  
    {  
       printf("打印失败\n");  
       return;  
    }  
   for(;i<S->size;i++)  
   {  
       printf("%d\n",S->arr[i]);  
   }  
   printf("\n");  
}  
  
void StackPush(Stack *S,DataType data)//入栈  
{  
    if(NULL == S->arr)  
    {  
       printf("入栈失败\n");  
       return;  
    }  
    if(S->capacity == S->size)//空间已满  
    {  
       AddCapacity(S);  
    }  
    S->arr[S->size] = data;  
    S->size++;  
}  
  
void StackPop(Stack *S)//出栈  
{  
   if(NULL == S->arr)  
    {  
       printf("出栈失败\n");  
       return;  
    }  
   S->size--;  
}  
  
DataType StackTop(PStack P)//获取栈顶元素  
{  
    return P->arr[P->size - 1];  
  /* int ret = 0; 
   if(NULL == S->arr) 
    { 
       printf("获取栈失败\n"); 
       return; 
    } 
   if(0 == S->size) 
   { 
   printf("栈为空!\n"); 
   return; 
   } 
   
   printf("栈顶元素为:%d \n", S->arr[S->size - 1]);*/  
}  
  
void StackSize(Stack *S)//获取元素个数  
{  
   if(NULL == S->arr)  
    {  
       printf("获取栈失败\n");  
       return;  
    }  
   printf("元素个数为:%d\n",S->size);  
}  
  
int StackEmpty(Stack *S)//检测栈是否为空  
{  
    if(NULL == S->arr)  
    {  
       printf("获取栈失败\n");  
       return 0;  
    }  
    if(S->size == 0)  
    {  
    printf("栈为空\n");  
    return 1;  
    }  
    return 0;  
}  

Stack.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct int DataType
typedef struct Stack
{
   DataType *_arr;
   int  capacity;
   int  size;
}Stack;
// 栈的初始化   
void StackInit(Stack *S, int capacity);  
  
// 入栈   
void StackPush(Stack *S, DataType data);  
  
// 出栈   
void StackPop(Stack *S);  
  
// 获取栈顶元素   
DataType StackTop(Stack *S);  
  
// 获取栈中元素个数   
void StackSize(Stack *S);  
  
// 检测栈是否为空   
int StackEmpty(Stack *S);  



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值