C/C++ PTA 6-2 代替スタック --- データ構造

ホームページ

まだまだ未知の探索が待っている_データ構造、C言語の難しさ、小規模プロジェクト - CSDNブログ
特別コラム---データ構造

データ構造_探索を待っている未知のブログがまだあります - CSDN ブログ

ご協力ありがとうございました!

目次

 1. タイトル

関数インターフェースの定義:

審判テスト手順の例:

入力例:

出力サンプル: 

制限:

2. 説明 

1. スタックへのプッシュとポップの詳細

2. コードの実装

 


 1. タイトル

スタックのシーケンシャル ストレージの実装では、別の方法として、Top をスタックの最上部の前の位置として定義します。この定義に基づいてスタックのプッシュ、ポップ動作を実現するプログラムを作成してください。スタックが空かいっぱいかをどうやって判断するのでしょうか?

1. 関数インターフェースの定義:

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 を返す必要があります。

2. 審判テスト手順の例:

#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\n", X);
            break;
        case end:
            PrintStack(S);
            done = 1;
            break;
        }
    }
    return 0;
}

/* 你的代码将被嵌在这里 */

3. 入力サンプル:

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

4.出力サンプル: 

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

5. 制限事項:

コード長制限

16KB

制限時間

400ミリ秒

メモリ制限

64MB

2. 説明 

関数のインターフェイス定義によれば、この質問ではスタックへのプッシュとポップの操作を完了できますが、質問の説明によると、通常のスタックと唯一異なるのは、スタックの先頭ポインタがスタックはスタックの最上位要素を指します。次の配列座標。

次に、比較の考え方に基づいて、この代替スタックのプッシュインおよびポップアウト動作が完了します。

1. スタックへのプッシュとポップの詳細

青は通常のスタックを表し、赤は代替スタックを表します。

1) Top は以前は -1 に初期化されていましたが、現在はTop は 0 に初期化されています。

2) スタックにプッシュする前に、まずスタックがいっぱいかどうかを判断しました。スタックがいっぱいである条件は Top==MaxSize -1 でした。Top はスタックの最上位要素の次の配列添字を指しているため、スタックがいっぱいである条件は、スタックの満杯度はTop== MaxSizeです

3) 次にプッシュ操作ですが、以前は Top++ を実行してからプッシュ操作を実行していましたが、現在は最初にプッシュしてから Top++ 操作を実行します。

4) スタックをポップする前に、最初にスタックが空かどうかを判断する必要があります。以前のスタックの空の状態は Top==-1 でしたが、現在の空の状態は Top==0 です

5) ポップ操作では、最初に、Top は別の意味を指しているため、最初に Top-- を渡し、次にそれを渡す必要があります

2. コードの実装

書くときは、簡単にするために、pre-increment と post-increment または self-decrement を使用しました。

違い: a++ は最初に使用されてから加算されます。++a は最初に使用されてから加算されます。a-- は最初に使用されてから減算されます。--a は最初に使用されてから減算されます。

bool Push(Stack S, ElementType X)
{
    if (S->Top == S->MaxSize)//判满条件
    {
        printf("Stack Full\n");
        return false;
    }
    S->Data[S->Top++] = X;
    return true;
}
ElementType Pop(Stack S)
{
    if (S->Top == 0)//判空条件
    {
        printf("Stack Empty\n");
        return ERROR;
    }
    return S->Data[--S->Top];
}

 

おすすめ

転載: blog.csdn.net/qq_73435980/article/details/133420693