数据结构静态栈的基本功能实现

/*
    2018年10月16日10:08:50
 
    栈的基本功能是 出栈 入栈  遵循”先进后出“原则
    所以栈的基本函数可以有栈的初始化 出入栈过程中栈的状态判断 是否为空或满  以及销毁
    实现顺序栈的基本运算的算法
    (1)初始化栈
    (2)判断栈s是否为空
    (3)一次入栈a, b, c, d, e
    (4)再次判断栈s是否为空
    (5)出栈所有元素
    (6)再次判断是否为空
    (7)销毁栈
*/
 
 
# include<stdio.h>
# include<stdlib.h>
 
# define MAXSIZE 10//注意有一个位置作为栈满标志
 
struct stack* Init_stack(void);
bool Gettop(struct stack* s, int* data);
bool Pop(struct stack* s, int* data);
bool Push(struct stack* s, int data);
bool Stack_full(struct stack* s);
bool Stack_empty(struct stack* s);
void Destroy_stack(struct stack* s);
 
struct stack  
{
    int data[MAXSIZE];//栈体
    int top;//栈顶
};
 
int main(void)
{
    struct stack* s = Init_stack();
    int data, i;
 
    if(Stack_empty(s))//判断是否为空
        printf("stack is not empty!\n");
    else
        printf("stack is empty!\n");
    printf("插入:");
    for(i = 0; i < 11; i++)//入栈
    {
        if(Push(s, 'a'+i))
            putchar('a'+i);
        else
            printf("栈满!\n");
        putchar(',');
    }
    putchar('\n');
 
    if(Stack_empty(s))//判断是否为空
        printf("stack is not empty!\n");
    else
        printf("stack is empty!\n");
 
    for(i = 0; i < 11; i++)//出栈
    {
        if(Pop(s, &data))
            printf("%c  ", data);
        else
            printf("空栈!\n");
    }
    putchar('\n');
 
    if(Stack_empty(s))//判断是否为空
        printf("stack is not empty!\n");
    else
        printf("stack is empty!\n");
 
    Destroy_stack(s);//销毁栈
    return 0;
}
/* 初始化栈 调用时会返回一个static stack *类型指针 并且这个指针指向一个栈 并且这个栈已经准备好被各种操作*/
struct stack* Init_stack(void)
{
    struct stack* s = (struct stack*)malloc(sizeof(struct stack));
    s->top = -1;//初始时设置栈顶为
    return s;
}
 
void Destroy_stack(struct stack* s)
{
    free(s);//销毁
}
 
//判断栈是否为空 true 为非空 false 为空
 
bool Stack_empty(struct stack* s)
{
    if(s->top == -1)//当两者相同时为空
        return false;
    else
        return true;
}
//判断栈是否为满 false 为满 ture 为非满
bool Stack_full(struct stack* s)
{
    if(s->top == MAXSIZE - 1)
        return false;//满
    else  
        return true;//不满
}
 
//入栈 成功入栈返回true否则返回false
 
bool Push(struct stack* s, int data)
{//出栈入栈 时调整栈指针与入栈出栈数据位置不可以调换
    if(Stack_full(s))//不满时入栈
    {
        s->top += 1;//调整栈顶指针  
        s->data[s->top] = data;//入栈
        return true;
    }
    return false;//入栈失败 栈满
}
 
//出栈 出栈时判断是否为空 栈为空时出栈失败返回false 栈不为空返回true  
bool Pop(struct stack* s, int* data)
{
    if(Stack_empty(s))//是否为空
    {
        *data = s->data[s->top];//调整栈指针
        s->top -= 1;
 
        return true;
    }
    return false;
}
 
//取栈顶而不改变栈顶指针
bool Gettop(struct stack* s, int* data)
{
    if(Stack_empty(s))//是否为空
    {
        *data = s->data[s->top];//与出栈基本相同不过 不调整栈指针
        return true;
    }
    return false;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值