• 习题3.14 另类堆栈(15 分)浙大版《数据结构(第2版)》题目集


    在栈的顺序存储实现中,另有一种方法是将Top定义为栈顶的上一个位置。请编写程序实现这种定义下堆栈的入栈、出栈操作。如何判断堆栈为空或者满?

    函数接口定义:

    bool Push( Stack S, ElementType X );
    ElementType Pop( Stack S );
    

    其中Stack结构定义如下:

    typedef int Position;
    typedef struct SNode *PtrToSNode;
    struct SNode {
        ElementType *Data;  /* 存储元素的数组 */
        Position Top;       /* 栈顶指针       */
        int MaxSize;        /* 堆栈最大容量   */
    };
    typedef PtrToSNode Stack;
    

    注意:如果堆栈已满,Push函数必须输出“Stack Full”并且返回false;如果队列是空的,则Pop函数必须输出“Stack Empty”,并且返回ERROR。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define ERROR -1
    typedef int ElementType;
    typedef enum { push, pop, end } Operation;
    typedef enum { false, true } bool;
    typedef int Position;
    typedef struct SNode *PtrToSNode;
    struct SNode {
        ElementType *Data;  /* 存储元素的数组 */
        Position Top;       /* 栈顶指针       */
        int MaxSize;        /* 堆栈最大容量   */
    };
    typedef PtrToSNode Stack;
    
    Stack CreateStack( int MaxSize )
    {
        Stack S = (Stack)malloc(sizeof(struct SNode));
        S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
        S->Top = 0;
        S->MaxSize = MaxSize;
        return S;
    }
    
    bool Push( Stack S, ElementType X );
    ElementType Pop( Stack S );
    
    Operation GetOp();          /* 裁判实现,细节不表 */
    void PrintStack( Stack S ); /* 裁判实现,细节不表 */
    
    int main()
    {
        ElementType X;
        Stack S;
        int N, done = 0;
    
        scanf("%d", &N);
        S = CreateStack(N);
        while ( !done ) {
            switch( GetOp() ) {
            case push: 
                scanf("%d", &X);
                Push(S, X);
                break;
            case pop:
                X = Pop(S);
                if ( X!=ERROR ) printf("%d is out
    ", X);
                break;
            case end:
                PrintStack(S);
                done = 1;
                break;
            }
        }
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    

    输入样例:

    4
    Pop
    Push 5
    Push 4
    Push 3
    Pop
    Pop
    Push 2
    Push 1
    Push 0
    Push 10
    End
    

    输出样例:

    Stack Empty
    3 is out
    4 is out
    Stack Full
    0 1 2 5
    

    代码:

    bool Push( Stack S, ElementType X )
    {
        if(S->Top == S->MaxSize)
        {
            printf("Stack Full
    ");
            return false;
        }
        else
        {
            S->Data[S->Top] = X;
            S->Top ++;
        }
    }
    ElementType Pop( Stack S )
    {
        if(S->Top == 0)
        {
            printf("Stack Empty
    ");
            return ERROR;
        }
        else
        {
            ElementType a = S->Data[S->Top - 1];
            S->Top --;
            return a;
        }
    }
  • 相关阅读:
    C语言-第32课
    typeof和clamp
    C语言void*和*p的使用
    C语言二级指针和一级指针
    C语言结构体变量成员之指针变量成员的坑
    控制硬件三部曲
    C语言const char*使用
    jiffies是什么
    TPO3-1 Architecture
    相关关系|相关系数|线性关系|
  • 原文地址:https://www.cnblogs.com/8023spz/p/7643386.html
Copyright © 2020-2023  润新知