スタックメモリ構造のシーケンス、すなわち順次要素のスタックの最上位にスタック底部からのデータを記憶する記憶部の連続したアドレスのセットを使用して、順次スタックを使用して実装されています。それぞれ、使用トップポインタとベーススタックの頂部および底部へのポインタポイント。
- スタックが空の兆候があります:トップ==ベース。
- なお:スタックポインタは、常に最上位要素の位置に非空のスタックを指します。
- スタック処理方法ときフル:
- 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;
}
- 業績