データ構造 - スタックの順序

スタックメモリ構造のシーケンス、すなわち順次要素のスタックの最上位にスタック底部からのデータを記憶する記憶部の連続したアドレスのセットを使用して、順次スタックを使用して実装されています。それぞれ、使用トップポインタとベーススタックの頂部および底部へのポインタポイント。

  • スタックが空の兆候があります:トップ==ベース。
  • なお:スタックポインタは、常に最上位要素の位置に非空のスタックを指します
  • スタック処理方法ときフル:
    • 1、エラーは、オペレーティングシステムに戻ります。
    • 2、スタック、新しいスタックにオリジナルコンテンツのスタックとして、より多くのスペース、収納スペースを割り当て。

1.スタックは、配列を表します

#define  MAXSIZE  100
typedef struct
{
    SElemType   *base;
    SElemType   *top;
    int stacksize;
}SqStack

2.スタック初期化シーケンス

  • アルゴリズムのステップ
    • 図1に示すように、割り当てられたスペースとスペースの割り当てが失敗したかどうかのチェックは、エラーが失敗した場合に戻され
    • 図2に示すように、スタックの底部とスタックポインタが提供される:S.top = S.baseと、文がS.top = S.base S.base = S.topべきではないことに留意され
    • 図3に示すように、スタックのサイズが提供され
  • アルゴリズムの説明
int InitStack(SqStack &S)
{
	S.base=new int[MAX];  // 为顺序栈动态分配一个最大容量为MAX的数组空间
	if(!S.base)
	{
		return 0;
	}

	S.top=S.base;
	S.stacksize=MAX;
	return 1;
}

2.順序は、スタックが空であるか否かを判断します

int StackEmpty( SqStack S )
{
    if(S.top == S.base) 
        return 0;  // 为空
    else 
        return 1;  // 非空
}

スタック必要な長さの3順

int StackLength(SqStack S)
{
    return S.top – S.base;
}

スタックの4.空のシーケンス

int ClearStack(SqStack S)
{
    if(S.base) 
        S.top = S.base;
	
    return 1;
}

スタックの破壊の順序

Status DestroyStack(SqStack &S)
{
    if(S.base)
    {
	    delete S.base ;
	    S.stacksize = 0;
	    S.base = S.top = NULL;
    }
  
    return 1;
}

6.スタックプッシュのシーケンス

  • アルゴリズムのステップ
    • 1.それはエラーに満ちている場合、スタックは、満杯の場合
    • 図2に示すように、上にスタック要素e
    • 3、スタックポインタプラス
  • アルゴリズムの説明
int Push_S(SqStack &S,int e)
{
    //将元素e入栈 
    if(S.top-S.base==S.stacksize)  //判断栈是否满 
    {
        return 0;
    }
	
    *S.top++=e;   // *S.top=e;  S.top++;
    return 1;
}

7.スタックポップのシーケンス

  • アルゴリズムのステップ
    • エラーがnullの場合1、それは、空のスタックか否かが判断されます 
    • 図2に示すように、スタックポインタはデクリメントされます
    • 図3に示すように、スタックから最上位要素
  • アルゴリズムの説明
//出栈
int Pop_S(SqStack &S,int &e)
{
	//用e返回出栈的元素
    if(S.top==S.base)
    {//栈空 
        return 0;
    } 
	
    e=*--S.top;  // --S.top;e=*S.top;
    return 1;
}

8.トップ要素を削除します

  • アルゴリズムのステップ
    • エラーが返された場合は、空、空のスタックかどうかを判断し、そうでない場合は先頭の要素のスタックポインタを介して取得
  • アルゴリズムの説明
int GetTop( SqStack S, SElemType &e)  
{
    if( S.top == S.base )	 
        return 0; 	// 栈空
    e = *(S.top – 1);
    return 1;
}

9.コードの実装

  • main.cppに
#include <iostream>

using namespace std;

#define MAX 100

//顺序栈的定义 
typedef struct 
{
	int *base;
	int *top;
	int stacksize;
}SqStack;

//初始化
int InitStack(SqStack &S) 
{
	S.base = new int[MAX]; // 为顺序栈动态分配一个最大容量为MAX的数组空间
	if (!S.base) 
	{
		return 0;
	}
	
	S.top = S.base;//初始化将栈置空,就是让头指针指向尾指针,从语句上讲就是把尾指针的值赋值给头指针 
	S.stacksize = MAX;
	
	return 1;
}

//入栈
int Push_S(SqStack &S, int e) 
{
	//将元素e入栈 
	if (S.top - S.base == S.stacksize) // 判断栈是否满 
	{
		return 0;
	}
	*S.top++ = e;   // *S.top=e;  S.top++;
	
	return 1;
}

//出栈
int Pop_S(SqStack &S, int &e) 
{
	//用e返回出栈的元素
	if (S.top == S.base) // 判断栈是否为空 
	{                
		return 0;
	}
	e = *--S.top;   // --S.top;e=*S.top;
	
	return 1;
}

// 取栈顶元素
int GetTop( SqStack S, int &e)  
{
	if (S.top == S.base)
		return 0; 	// 栈空
	
	e = *(S.top - 1);
	
	return 1;
}

int main()
{
	SqStack S;

	if (InitStack(S)) 
	{
		printf("顺序栈初始化成功!\n");
	}
	else 
	{
		printf("顺序栈初始化失败!\n");
	}

	int loop = 1;
	int e1;
	int i = 1;
	
	// 入栈
	printf("请输入入栈元素(输入0终止):\n");
	while (loop) 
	{
		printf("请输入第%d个元素值:",i++);
		scanf("%d", &e1);
		if (e1 != 0) 
		{
			Push_S(S,e1);

		}
		else if (e1 == 0) 
		{
			loop = 0;
		}
	}

	// 取栈顶元素
	int e2;
	GetTop(S, e2);
	printf("栈顶元素是:%d\n", e2);

	// 出栈
	int e3; int j = 1;
	while (S.top != S.base)
	{
		Pop_S(S, e3);
		printf("第%d个出栈的元素是:%d\n",j++,e3);
	}
	
	system("pause");
	
	return 0;
}
  • 業績

おすすめ

転載: blog.csdn.net/qq_22847457/article/details/94354768