数据结构作业的代码——————栈的顺序实现

作业code1:

  • 将上课给的顺序表形式实现栈的程序补充(代码已发给大家):
  • 实现通过键盘进行插入
  • 实现通过键盘进行删除
  • 良好的人机交互

发的代码:

#include 
#include 

typedef int SElemType;
typedef int Status;
#define INIT_SIZE 100
#define STACKINCREMENT 10
#define Ok 1
#define Error 0
#define True 1
#define False 0
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

//初始化栈
Status InitStack(SqStack *s)
{
    s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
    if(!s->base)
    {
        puts("存储空间分配失败!");
        return Error;
    }
    s->top = s->base;
    s->stacksize = INIT_SIZE;
    return Ok;
}

//清空栈
Status ClearStack(SqStack *s)
{
    s->top = s->base;
    return Ok;
}

//栈是否为空
Status StackEmpty(SqStack *s)
{
    if(s->top == s->base)
        return True;
    else
        return False;
}

//销毁栈
Status Destroy(SqStack *s)
{
    free(s->base);
    s->base = NULL;
    s->top = NULL;
    s->stacksize=0;
    return Ok;
}

//获得栈顶元素
Status GetTop(SqStack *s, SElemType &e)
{
    if(s->top == s->base)
        return Error;
    e = *(s->top - 1);
    return Ok;
}

//压栈
Status Push(SqStack *s, SElemType e)
{
    if(s->top - s->base >= s->stacksize)//栈满
    {
        s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!s->base)
        {
            puts("存储空间分配失败!");
            return Error;
        }
        s->top = s->base + s->stacksize;//修改栈顶位置
        s->stacksize += STACKINCREMENT;//修改栈长度

    }
    *s->top++ = e;
    return Ok;
}

//弹栈
Status Pop(SqStack *s, SElemType *e)
{
    if(s->top == s->base)
        return Error;
    --s->top;
    *e = *(s->top);
    return Ok;
}

//遍历栈
Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
{
    SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
    SElemType *t = s->top;
    while(t > b)
        visit(*b++);
    printf("\n");
    return Ok;
}

Status visit(SElemType c)
{
    printf("%d ",c);
    return Ok;
}

int main()
{
    SqStack a;
    SqStack *s = &a;
    SElemType e;
    InitStack(s);
    int n;
    puts("请输入要进栈的个数:");
    scanf("%d", &n);
    while(n--)
    {
        int m;
        scanf("%d", &m);
        Push(s, m);
    }
    StackTraverse(s, visit);
    puts("");
    puts("8进栈后:");
    Push(s, 8);
    StackTraverse(s, visit);
    puts("");
    Pop(s, &e);
    printf("出栈的元素是:%d\n", e);
    printf("元素出栈后事实上并没有清除,依然存在于内存空间,所谓的出栈只是指针移动,出栈的元素是%d\n", *s->top);//判断出栈后元素是否还存在于内存中
    Destroy(s);
    return 0;
}
  • J17-4-name-code-第二次-栈.cpp

感觉就是给它换了个衣服,函数基本上都没有发上变化
明天 还需要写栈的链式实现

#include 
#include 
#include 
using namespace std;
typedef int SElemType;
typedef int Status;
#define INIT_SIZE 100
#define STACKINCREMENT 10
#define Ok 1
#define Error 0
#define True 1
#define False 0
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

//初始化栈
Status InitStack(SqStack *s)
{
    s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
    if(!s->base)
    {
        puts("存储空间分配失败!");
        return Error;
    }
    s->top = s->base;
    s->stacksize = INIT_SIZE;
    return Ok;
}

//清空栈
Status ClearStack(SqStack *s)
{
    s->top = s->base;
    return Ok;
}

//栈是否为空
Status StackEmpty(SqStack *s)
{
    if(s->top == s->base)
        return True;
    else
        return False;
}

//销毁栈
Status Destroy(SqStack *s)
{
    free(s->base);
    s->base = NULL;
    s->top = NULL;
    s->stacksize=0;
    return Ok;
}

//获得栈顶元素
Status GetTop(SqStack *s, SElemType &e)
{
    if(s->top == s->base)
        return Error;
    e = *(s->top - 1);
    return Ok;
}

//压栈
Status Push(SqStack *s, SElemType e)
{
    if(s->top - s->base >= s->stacksize)//栈满
    {
        s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!s->base)
        {
            puts("存储空间分配失败!");
            return Error;
        }
        s->top = s->base + s->stacksize;//修改栈顶位置
        s->stacksize += STACKINCREMENT;//修改栈长度

    }
    *s->top++ = e;
    return Ok;
}

//弹栈
Status Pop(SqStack *s, SElemType *e)
{
    if(s->top == s->base)
        return Error;
    --s->top;
    *e = *(s->top);
    return Ok;
}

//遍历栈
Status StackTraverse(SqStack *s,Status(*visit)(SElemType))
{
    SElemType *b = s->base;//此处不能直接用base或top移动,即不能改变原栈的结构
    SElemType *t = s->top -1;
    while(t >= b)
        visit(*t--);
//        visit(*b++);
    printf("\n");
    return Ok;
}

Status visit(SElemType c)
{
    printf("%d ",c);
    return Ok;
}
void menu()
{
      cout<<" menu:"<<endl;
      cout<<"1.进栈"<<endl;
      cout<<"2.出栈"<<endl;
      cout<<"3.输出"<<endl;
      cout<<"4.menu"<<endl;
      cout<<"0.结束"<<endl;
}
void preface()
{
        printf("                               *********************************************\n"
               "                               *                                           *\n"
               "                               *    此程序的功能:                         *\n"
               "                               *    将整数类型的数据进行栈的操作           *\n"
               "                               *                                           *\n"
               "                               *********************************************\n"
               "\n\n"
               );
}
int main()
{
        SqStack a;
        SqStack *s = &a;
        SElemType e;
        InitStack(s);
        preface();
        menu();
        int choose;
        int x;
        while(true)
        {
                cout<<"\n请选择:";
                cin>>choose;
                int k=0;
                switch(choose)
                {
                        case 1:
                                printf("请输出需要进栈的个数:");
                                cin>>x;
                                printf("请输入%d个元素:",x);
                                while(x--)
                                {
                                        cin>>e;
                                        Push(s,e);
                                }
//                                printf("进栈成功!\n");
                                break;
                        case 2:
                                Pop(s,&e);
                                printf("出栈的元素是:%d\n", e);
                                break;
                        case 3:
                                StackTraverse(s, visit);
                                printf("栈已全部输出!\n");
                                break;
                        case 4:
                                menu();
                                break;
                        case 0:
                                k=1;
                                break;
                        default:
                                printf("请重新输入!");
                                break;
                }
                if(k)   break;
        }
        Destroy(s);
    return 0;
}

你可能感兴趣的:(数据结构——作业)