ホームページ
まだまだ未知の探索が待っている_データ構造、C言語の難しさ、小規模プロジェクト - CSDNブログ
特別コラム---データ構造データ構造_探索を待っている未知のブログがまだあります - CSDN ブログ
ご協力ありがとうございました!!!
目次
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]; }