顺序栈的完整实现

来源:互联网 发布:oa办公系统java源代码 编辑:程序博客网 时间:2024/06/05 21:01

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

 

#define STACK_INIT_SIZE 15//栈的初始空间大小

#define STACKINCREMENT 5//栈的追加空间大小

 

typedef struct MyStruct

{

    int* top;       //top指针记录栈顶元素在栈中的位置

    int* base;      //base指针,始终指向栈底

    int stacksize; //当前已分配的存储空间大小

}SqStack;

 

void InitStack(SqStack *s)//初始化空栈

{

    s->base = (int*)malloc(STACK_INIT_SIZE *sizeof(int));//分配int大小的(STACK_INIT_SIZE)个连续存储空间

    if (!(s->base))

    {

        printf("分配失败!!\n");

    }

    else

    {

        s->top = s->base;

        s->stacksize = STACK_INIT_SIZE;

        printf("空栈初始化完成!!\n");

    }

}

 

void IsEmpty(SqStack *s)//判断栈是否为空

{

    if (s->top ==s->base)

    {

        printf("栈为空!!\n");

    }

    else

    {

        printf("栈非空!!\n");

    }

}

 

int IsFull(SqStack *s)//判断栈是否已满

{

    if (s->top -s->base == s->stacksize - 1)

    {

        printf("栈已满!!\n");

    }

    else

    {

        printf("栈不满!!\n");

    }

    return 0;

}

 

 

void PushStack(SqStack *s)//元素入栈

{

    //InitStack(s);

    int x;

    if (s->top -s->base >= s->stacksize)

    {

        s->base = (int*)realloc(s->base, (s->stacksize +STACKINCREMENT) * sizeof(int));

 

    }

    printf("请输入要入栈的元素:\n");

    scanf("%d", &x);

    *(s->top) = x;

    s->top++;

}

 

void PopStack(SqStack *s)//元素出栈

{

    //InitStack(s);

    printf("**********\n");

    if (s->top ==s->base)

    {

        printf("判断:栈为空,不能操作出栈\n");

    }

    else

    {

        int x;

        x= *(s->top - 1);//先把top位置上的值赋给x,再让top往下移动一位

        s->top--;

        printf("%d 出栈\n", x);

    }

}

 

void GetTop(SqStack *s)//获取栈顶元素

{

    if (s->top >s->base)

    {

        printf("**********\n");

        printf("栈顶元素为:%d\n", *(s->top - 1));

        printf("**********\n");

    }

    else

    {

        printf("栈为空!!\n");

    }

}

 

void Show(SqStack *s)//该函数用来在元素都完成出栈后进行原来位置打印,对比效果

{

    printf("栈中元素原来位置上的值为:");

    printf("%d  ", *(s->top));

}

 

void GetLength(SqStack *s)//获取栈长

{

    int size;

    size= (s->top) - (s->base);

    printf("栈长为:%d\n", size);

}

 

void Display(SqStack *s)//遍历栈,从栈底开始遍历

{

    while (s->base <=s->top)

    {

        printf("%d  ", *(s->base++));

    }

}

 

 

void Menue()

{

    SqStack s;

    int flag;

    printf("\t\t\t**********\n");

    printf("\t\t\t1:初始化\n");

    printf("\t\t\t2:判断是否为空\n");

    printf("\t\t\t3:判断是否为满\n");

    printf("\t\t\t4:元素入栈\n");

    printf("\t\t\t5:元素出栈\n");

    printf("\t\t\t6:取栈顶元素\n");

    printf("\t\t\t7:获取栈长度\n");

    printf("\t\t\t8:遍历栈元素\n");

    printf("\t\t\t9:遍历位置元素\n");

    printf("\t\t\t0:退出\n");

    printf("\t\t\t**********\n");

    printf("请输入相应的序号操作:\n");

    scanf("%d", &flag);

    while (1)

    {

 

        switch (flag)

        {

        case1:InitStack(&s);

            break;

        case 2:IsEmpty(&s);

            break;

        case 3:IsFull(&s);

            break;

        case 4:PushStack(&s);

            break;

        case 5:PopStack(&s);

            break;

        case 6:GetTop(&s);

            break;

        case7:GetLength(&s);

            break;

        case 8:Display(&s);

            break;

        case 9:Show(&s);

            break;

        case 0:exit(0);

            break;

        default:printf("输入指令有误!!\n");

            break;

        }

        printf("请输入相应的序号操作:\n");

        scanf("%d", &flag);

 

    }

}

 

void main()

{

    Menue();//主函数调用

    system("pause");

}

 

 

1 0