数据结构(顺序栈)

数据结构(顺序栈)

数据结构教程117页上机

主函数

//
// Created by Snow on 2023/3/8.
//
#include"sqstack.cpp"
int main()
{
    int choice;
    SqStack *s=nullptr;
    PrintCommand();
    while(1)
    {
        printf("\n请输入下一个操作:\n");
        scanf("%d",&choice);
        Choice(s,choice);
    }
}

实现函数

//
// Created by Snow on 2023/3/8.
//
#include<cstdio>
#include<windows.h>
#define MaxSize 20
typedef char ElemType;
typedef struct
{
    ElemType data[MaxSize-1];//存放栈中的数据元素
    int top;//栈顶指针,即存放栈顶元素在data数组中的下标
}SqStack;//顺序栈类型
//打印菜单
void PrintCommand()
{
    printf("         欢迎使用顺序栈操作系统\n\n");
    printf("1.初始化栈s                        2.判断栈s是否非空\n");
    printf("3.依次进栈元素a,b,c,d,e            4.判断栈s是否非空\n");
    printf("5.输出出栈序列                     6.判断栈s是否非空\n");
    printf("7.释放栈                           0.结束程序\n");
}
//初始化栈
bool InitStack(SqStack *&s)
{
    if(s!=nullptr)
    {
        printf("此栈已存在!\n");
        return false;
    }
    s=(SqStack *)malloc(sizeof(SqStack));//分配一个顺序栈空间,首地址存放在s中
    if(s==nullptr)
    {
        printf("栈初始化失败!\n");
        return false;
    }
    s->top=-1;//栈顶指针置为-1
    return true;
}
//销毁栈
bool DestroyStack(SqStack *&s)
{
    if(s==nullptr)
    {
        printf("栈不存在!\n");
        return false;
    }
    free(s);
    return true;
}
//判断栈是否为空
bool StackEmpty(SqStack *s)
{
    if(s==nullptr)
    {
        printf("栈不存在!\n");
        return false;
    }
    if(s->top==-1)
        printf("空栈!\n");
    else
        printf("栈中已含有数据!\n");
    return true;
}
//进栈
bool Push(SqStack *&s,ElemType e)
{
    if(s==nullptr)
    {
        printf("栈不存在!\n");
        return false;
    }
    if(s->top==MaxSize-1)//栈满的情况,即栈上溢出
    {
        printf("栈满!\n");
        return false;
    }
    s->top++;//栈顶指针增一
    s->data[s->top]=e;//元素e放在栈顶指针处
    return true;
}
//出栈
bool Pop(SqStack *&s,ElemType &e)
{
    if(s==nullptr)
    {
        printf("栈不存在!\n");
        return false;
    }
    if(s->top==-1)//栈为空的情况,即栈下溢出
        return false;
    e=s->data[s->top];//取栈顶元素
    s->top--;//栈顶指针减一
    return true;
}
//选择操作
bool Choice(SqStack *&s, int i)
{
    bool OK;
    int j;
    ElemType e,arr[]{'a','b','c','d','e'};
    switch(i)
    {
        case 1:
            OK=InitStack(s);
            if(OK)printf("初始化操作成功!\n");
            else printf("初始化操作失败!\n");
            break;
        case 2:
            OK=StackEmpty(s);
            if(OK)printf("判断栈操作成功!\n");
            else printf("判断栈操作失败!\n");
            break;
        case 3:
            for(j=0;arr[j]!='\0';j++)
            {
                OK=Push(s,arr[j]);
                if(OK)printf("进栈操作成功!\n");
                else printf("进栈操作失败!\n");
            }
            break;
        case 4:
            OK=StackEmpty(s);
            if(OK)printf("判断栈操作成功!\n");
            else printf("判断栈操作失败!\n");
            break;
        case 5:
            while(s->top!=-1)
            {
                OK=Pop(s,e);
                printf("%c ",e);
            }
            printf("\n");
            if(OK)printf("输出出栈序列操作成功!\n");
            else printf("输出出栈序列操作失败!\n");
            break;
        case 6:
            OK=StackEmpty(s);
            if(OK)printf("判断栈操作成功!\n");
            else printf("判断栈操作失败!\n");
            break;
        case 7:
            OK= DestroyStack(s);
            if(OK)printf("销毁栈操作成功!\n");
            else printf("销毁栈操作失败!\n");
            break;
        case 0:
            printf("感谢使用!下次再见!\n");
            system("pause");
            exit(0);
        default:printf("指令错误,请再尝试一次\n");
    }
}

GBK编码

posted @ 2023-03-08 21:32  SnowDreamXUE  阅读(13)  评论(0编辑  收藏  举报  来源