一,關於棧
我的理解就是一種具有特殊規定的數組結構的稱呼(即先進後出,後進先出)
eg:類似於生活中往箱子裏面放衣服,如果想從箱子裏拿衣服,只能拿最上面的一層,即最後放進去的(後進先出)
二,棧的結構體表示
結構體定義
struct Node
{
int NodeNum[MaxSize]; //定義順序棧大小
int top; //棧頂順序表位置
int base; //棧底順序表位置
int MaxNode; //棧的大小
};
圖解:
如圖的a b c d分別代表空棧,滿棧,出棧,入棧情況。
首先可以看出跟數組的儲存幾乎類似。
然後根據圖中可以得出:
- 判斷空棧的方法即爲:top是否等於base
- 判斷棧滿方法即爲: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;
}
學了幾個新的編輯功能,不知道大家感覺怎麼樣。
有什麼意見歡迎下面評論,感謝支持