關於順序棧的代碼編寫即解釋

 

一,關於棧

我的理解就是一種具有特殊規定的數組結構的稱呼(即先進後出,後進先出

eg:類似於生活中往箱子裏面放衣服,如果想從箱子裏拿衣服,只能拿最上面的一層,即最後放進去的(後進先出)

二,棧的結構體表示

結構體定義

struct Node
{
    int NodeNum[MaxSize];        //定義順序棧大小
    int top;                     //棧頂順序表位置
    int base;                    //棧底順序表位置
    int MaxNode;                 //棧的大小
};

圖解:

如圖的a b c d分別代表空棧,滿棧,出棧,入棧情況。

首先可以看出跟數組的儲存幾乎類似。

然後根據圖中可以得出:

  1. 判斷空棧的方法即爲:top是否等於base
  2. 判斷棧滿方法即爲:top減去base是否與MaxNode相等

順序棧的定義:

Node* Init()                        //定義
{
	Node*S = new Node;
	S->base = S->top = 0;
	S->MaxNode = MaxSize;
	return S;
}

先開闢新的空間,然後將top和base都賦值爲0;


順序棧入棧:

void Push(Node &S,int a)                 //入棧
{
	if (S.top - S.base != S.MaxNode)      //當棧頂減去棧底不等於棧大小,即棧未滿棧
	{
		S.NodeNum[S.top] =a;
		S.top++;         //棧頂元素加一
	}
}

先判斷棧是否滿了,若不滿,將該數據存入到順序棧中的top位,然後top++;


順序棧出棧:

void Pop(Node &S)          //出棧
{
	int a;
	if (S.top != S.base)                 //當棧頂不等於棧底,即棧不爲空
	{
		S.top--;         //棧頂元素減一
	}
}

先判斷棧是否爲空,若不空,將top--(此處出棧也沒返回元素,或顯示,可自行添加)


查看棧頂元素:

void ShowTop(Node *P)
{
	cout <<"棧頂元素爲:"<< P->NodeNum[P->top - 1]<<endl;
}

因爲top指向比棧頂元素多一位,所以棧頂元素位置即爲top--

但是此處爲什麼要用top-1,因爲top--的話棧頂位置也改變了,此處不需要改變棧頂位置,所以用top-1

(此處P->NodeNum[P->top - 1]*(P->NodeNum+P->top - 1)的值是一樣的,

    可以自己理解一下這兩句代碼的含義)


關於棧的遍歷:

void ShowAll(Node *P)
{
	cout << "棧的遍歷結果:";
	Node *Q = Init();             //通過輔助棧進行遍歷
	while (P->top != P->base)
	{
		Push(*Q, P->NodeNum[--P->top]);       //先將每一個數都存進輔助棧中
		cout << P->NodeNum[P->top]<<" ";
	}
	while (Q->top != Q->base)
	{
		Push(*P, Q->NodeNum[--Q->top]);       //再將輔助棧轉入原棧中
	}
}

因爲棧只能從頭開始出,所以需要定義一個新的輔助棧來進行遍歷

或者直接定義一個新的int a等於top,然後進行遍歷(突然感覺上面方法有點蠢)

 

全部代碼

#include<iostream>
using namespace std;

#define MaxSize 20

//順序棧
struct Node
{
	int NodeNum[MaxSize];        //定義順序棧大小
	int top;                     //棧頂順序表位置
	int base;                    //棧底順序表位置
	int MaxNode;                 //棧的大小
};

Node* Init()                        //定義
{
	Node*S = new Node;
	S->base = S->top = 0;
	S->MaxNode = MaxSize;
	return S;
}

void Push(Node &S,int a)                 //入棧
{
	if (S.top - S.base != S.MaxNode)      //當棧頂減去棧底不等於棧大小,即棧未滿棧
	{
		S.NodeNum[S.top] =a;
		S.top++;         //棧頂元素加一
	}
}

void Pop(Node &S)          //出棧
{
	int a;
	if (S.top != S.base)                 //當棧頂不等於棧底,即棧不爲空
	{
		S.top--;         //棧頂元素減一
	}
}

void ShowAll(Node *P)
{
	cout << "棧的遍歷結果:";
	Node *Q = Init();             //通過輔助棧進行遍歷
	while (P->top != P->base)
	{
		Push(*Q, P->NodeNum[--P->top]);       //先將每一個數都存進輔助棧中
		cout << P->NodeNum[P->top]<<" ";
	}
	while (Q->top != Q->base)
	{
		Push(*P, Q->NodeNum[--Q->top]);       //再將輔助棧轉入原棧中
	}
}
void ShowTop(Node *P)
{
	cout <<"棧頂元素爲:"<< P->NodeNum[P->top - 1]<<endl;
}
int main()
{
	Node *P = Init();
	int a = 10;
	Push(*P,a);
	ShowTop(P);
	Pop(*P);
	ShowAll(P);
	system("pause");
	return 0;
}

學了幾個新的編輯功能,不知道大家感覺怎麼樣。

有什麼意見歡迎下面評論,感謝支持

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章