数据结构实验三——顺序栈

#include <stdio.h>
#include <stdlib.h>
#define M 10
#define N 5
int flag=0;
typedef struct SeqStack
{
    char *top;
    char *base;
    int stacksize;
}SeqStack;
void InitStack(SeqStack *S)
{
    S->base=(char *)malloc(M*sizeof(char));
    S->top=S->base;
    S->stacksize=M;
}
void CreateStack(SeqStack *S)
{
    if(flag==1)
        printf("顺序栈已经创建!
");
    else
    {
        int i,length;
        char ch;
        printf("请输入要创建顺序栈的长度:
");
        scanf("%d",&length);
        for(i=0;i<length;i++)
        {
            printf("请输入顺序栈的元素:
");
            scanf("%c",&ch);
            if((ch=getchar())!='
')
            *S->top++=ch;
        }
        flag=1;
        printf("顺序栈创建完成!
");
    }
}
void PushStack(SeqStack *S)
{
    if(flag==0)
        printf("顺序栈未创建,无法进行入栈操作!
");
    else
    {
        char e;
        printf("请输入入栈的元素!
");
        e=getchar();
        scanf("%c",&e);
        if(S->stacksize<=S->top-S->base)
        {
            S->base=(char *)realloc(S->base,(S->stacksize+N)*sizeof(char));
            S->top=S->base+S->stacksize;
            S->stacksize+=N;
        }
        *S->top++=e;
        printf("入栈操作成功!
");
    }
}
void PopStack(SeqStack *S)
{
    if(flag==0)
        printf("顺序栈未创建,无法进行出栈操作!
");
    else
    {
        if(S->base==S->top)
            printf("顺序栈为空,无法进行出栈操作!
");
        else
        {
            char ch;
            ch=*--S->top;
            printf("顺序栈出栈成功,出栈元素为%c
",ch);
        }
    }
}
void StackLength(SeqStack S)
{
    int len;
    if(flag==0)
        printf("顺序栈未创建,无法计算栈长度!
");
    else
    {
        len=S.top-S.base;
        printf("顺序栈的长度为:%d
",len);
    }
}
int StackEmpty(SeqStack S)
{
    if(flag==0)
        printf("顺序栈未创建,无法判断是否为空!
");
    else
    {
        if(S.base==S.top)
        {
            printf("顺序栈为空!
");
            return 1;
        }
        else
            printf("顺序栈不为空!
");
    }
    return 0;
}
void DisplayStack(SeqStack S)
{
    if(flag==0)
        printf("顺序栈未创建,无法显示!
");
    else
    {
        char *r,*p=--S.top;
        char *q=S.base;
        printf("顺序栈的显示顺序为:
");
        for(r=p;r>=q;r--)
            printf("%c ",*r);
        printf("
");
    }
}
void DestoryStack(SeqStack *S)
{
    if(flag==0)
        printf("顺序栈未创建,不需要销毁!
");
    else
    {
        free(S->base);
        flag=0;
        printf("顺序栈已成功被销毁!
");
    }
}
void menu()
{
    printf("	顺序栈基本实验操作
");
    printf("*********************************
");
    printf("1 建立顺序栈!			*
");
    printf("2 顺序栈入栈操作!		*
");
    printf("3 顺序栈出栈操作!		*
");
    printf("4 求顺序栈长度!		*
");
    printf("5 判断顺序栈是否为空!		*
");
    printf("6 显示顺序栈!			*
");
    printf("7 销毁顺序栈!			*
");
    printf("0 退出程序!			*
");
    printf("*********************************
");
}
int main()
{
    int select;
    SeqStack ptr;
    InitStack(&ptr);
    while(1)
    {
        menu();
        printf("请输入选择命令:
");
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            CreateStack(&ptr);
            break;
        case 2:
            PushStack(&ptr);
            break;
        case 3:
            PopStack(&ptr);
            break;
        case 4:
            StackLength(ptr);
            break;
        case 5:
            StackEmpty(ptr);
            break;
        case 6:
            DisplayStack(ptr);
            break;
        case 7:
            DestoryStack(&ptr);
            break;
        case 0:
            exit(1);
            break;
        default :
            printf("命令输入有误,请重新输入!
");
            break;
        }
    }
    return 0;
}
这个我自己测试了一下。感觉没什么问题。其实也不知道到底有没有问题!发现问题,希望大家能指出!
原文地址:https://www.cnblogs.com/abc-24990/p/4257531.html