顺序存储实现栈

//栈是一种后进先出(FILO,first-in-last-out)的线性存储结构
//只能从一端对栈进行操作,这一端叫做栈顶(top)
//栈具有的操作:
//初始化栈
//判断是否为空
//判断是否为满
//入栈
//出栈
//读取栈顶元素
//获取栈中元素个数(栈的大小)
//对栈进行遍历
//清空一个栈

//这里先用顺序存储实现

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

#define MAXSIZE 3

typedef struct Student{
    char name[10];
    int age;
}Stu;

typedef struct Stu_Stack{
    Stu data[MAXSIZE];
    int top;
}stuStack;

//初始化一个空栈
void initStack(stuStack *stack)
{
    stack->top = -1;
}

//判断栈是否为空
bool isEmpty(stuStack *stack)
{
    return stack->top == -1;
}

//判断栈是否为满
bool isFull(stuStack *stack)
{
    return stack->top == MAXSIZE - 1;
}

//入栈
bool pushStack(stuStack *stack, Stu *s)
{
    //若栈满,则入栈失败
    if(isFull(stack))
    {
        return false;
    }
    //拷贝入栈元素的值到栈内,并使栈顶位置加1
    memcpy(&(stack->data[++stack->top]), s, sizeof(Stu));
    return true;
}

//出栈(仅仅是将栈顶位置减1,栈顶元素并未真正移除)
bool popStack(stuStack *stack)
{
    //若为空栈,则出栈失败
    if(isEmpty(stack))
    {
        return false;
    }
    stack->top--;
    return true;
}

//取栈顶元素(返回指针类型)
Stu * getTop(stuStack *stack)
{
    if(isEmpty(stack))
    {
        return NULL;
    }
    return &stack->data[stack->top];
}

//获取栈的实际大小(栈中元素的个数)
int stackSize(stuStack *stack)
{
    return stack->top+1;
}

//对栈进行遍历
void visitStack(stuStack *stack)
{
    if(isEmpty(stack))
    {
        printf("the stack is empty!\n");
        return;
    }
    int i;
    for(i = stack->top ; i >=0 ; i--)
    {
        printf("%s\t%d\n",stack->data[i].name, stack->data[i].age);
    }
}

//清空一个栈
void clearStack(stuStack *stack)
{
    stack->top = -1;
}


int main(int argc, char * argv[])
{
    stuStack test;
    initStack(&test);//初始化一个栈
    printf("栈是否为空?\t%d\n", isEmpty(&test));
    printf("栈是否为满?\t%d\n",isFull(&test));
    Stu r,s,t;
    strcpy(r.name,"pp");
    r.age = 24;
    strcpy(s.name,"eason");
    s.age = 41;
    strcpy(t.name,"yy");
    t.age = 26;
    printf("进行三次入栈操作\n");
    pushStack(&test, &r);
    pushStack(&test, &s);
    pushStack(&test, &t);
    printf("栈的元素个数:%d\n",stackSize(&test));
    printf("栈是否为空?\t%d\n", isEmpty(&test));
    printf("栈是否为满?\t%d\n",isFull(&test));
    printf("栈顶元素地址:%x\n", getTop(&test));
    printf("栈顶元素的值:\n");
    printf("%s\t%d\n",getTop(&test)->name,getTop(&test)->age);
    printf("遍历栈中元素:\n");
    visitStack(&test);
    printf("出栈成功?\t%d\n",popStack(&test));
    printf("此时,栈顶元素的值:\n");
    printf("%s\t%d\n",getTop(&test)->name,getTop(&test)->age);
    printf("此时,遍历栈中元素:\n");
    visitStack(&test);
    printf("执行清空栈的操作\n");
    clearStack(&test);
    printf("此时对栈进行遍历:\n");
    visitStack(&test);
    printf("此时栈的为空?\t%d\n",isEmpty(&test));
    printf("此时栈中元素个数?\t%d\n",stackSize(&test));
    getchar();
    return 0;
}

Ctrl+F5执行的结果如下:

执行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值