C++ 棧(Stack)的基本操作
阿新 • • 發佈:2019-01-07
一、棧的定義:
一種可以實現“先進後出(後進先出)”的儲存結構
生活中的例子:玩具槍的子彈夾,後進來的子彈先射出。
二、分類:
靜態棧:使用陣列
動態棧:連結串列
三、演算法:
出棧:push
壓棧:pop
棧是否為空:empty
棧的大小:size
訪問棧頂:top
四、應用:
(1)函式中呼叫其它函式,其它函式執行完之後返回結果給上一級的函式。
(2)中斷
(3)表示式求值
(4)記憶體分配
(5)緩衝處理
(6)迷宮
五、基本操作的實現程式:
#include <iostream>
using namespace std;
// 結點結構體
struct Node {
int data;
Node *next;
};
// 棧
struct Stack {
Node *pTop; // 頂部指標
Node *pBottom; // 底部指標
};
void Init(Stack *pS); // 初始化
void CreateStack(Stack *pS); // 建棧
void Travers(Stack *pS); // 遍歷棧
void Push(Stack *pS, int val); // 壓棧
bool Pop(Stack *pS); // 出棧:把棧頂的結點刪掉
bool getTop(Stack *pS, int &val); // 獲取棧頂元素:但不刪除棧頂結點
bool isEmpty(Stack *pS); // 判斷棧是否為空
int getSize(Stack *pS); // 獲取棧的長度
int main(int argc, const char * argv[]) {
Stack s; // 宣告物件,等價於 struct Stack s
int val, choose, len; // val儲存值,choose儲存使用者的選擇
bool finished = false;
while(!finished) {
cout << "1:初始化棧:" << endl;
cout << "2:建棧(以-1結束輸入):" << endl;
cout << "3:遍歷棧:" << endl;
cout << "4:壓棧:" << endl;
cout << "5:出棧:" << endl;
cout << "6:取棧頂的元素值:" << endl;
cout << "7:棧是否為空:" << endl;
cout << "8:獲取棧的長度:" << endl;
cout << "9:退出:" << endl;
cout << "請輸入你的選擇[1-9]:" << endl;
cin >> choose;
switch(choose) {
case 1:
Init(&s); // 初始化棧
break;
case 2:
CreateStack(&s); // 建棧
break;
case 3:
cout << "棧中的元素為:" << endl;
Travers(&s); // 遍歷棧
break;
case 4:
cout << "請輸入要壓入棧中的元素值:" << endl;
cin >> val;
Push(&s, val);
break;
case 5:
if(Pop(&s)) // 出棧
cout << "出棧成功!" << endl;
else
cout << "出棧失敗!" << endl;
break;
case 6:
if(getTop(&s, val))
cout << "棧頂元素的值為:" << val << endl;
else
cout << "棧為空!" << endl;
break;
case 7:
if(isEmpty(&s))
cout << "棧為空!" << endl;
else
cout << "棧不空" << endl;
break;
case 8:
len = getSize(&s);
cout << "棧的長度為:" << len << endl;
break;
case 9:
finished = true;
break;
default:
cout << "輸入選擇錯誤,請重新輸入!" << endl;
}
}
return 0;
}
// 初始化
void Init(Stack *pS) {
pS->pTop = new Node();
if(NULL == pS->pTop) {
cerr << "動態記憶體分配失敗!" << endl;
exit(1);
}
pS->pBottom = pS->pTop; // 頂部指標和底部指標指向同一個位置
pS->pTop->next = NULL; // pS->pBottom->next = NULL;
}
// 建棧
void CreateStack(Stack *pS) {
int val;
cout << "請輸入各個元素值:" << endl;
while(cin >> val && val != -1)
Push(pS, val);
}
// 壓棧
void Push(Stack *pS, int val) {
Node *newNode = new Node(); // 新建結點
if(NULL == newNode) {
cerr << "動態記憶體分配失敗!" << endl;
exit(1);
}
newNode->data = val;
newNode->next = pS->pTop;
pS->pTop = newNode; // 頂端指標往上移
}
// 遍歷棧
void Travers(Stack *pS) {
Node *p = pS->pTop;
while(p != pS->pBottom) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
// 判斷棧是否為空:通過比較棧頂和棧尾指標是否相等,如相等,說明為空
bool isEmpty(Stack *pS) {
if(pS->pTop == pS->pBottom)
return true;
return false;
}
// 出棧:把棧頂的結點刪掉
bool Pop(Stack *pS) {
if(isEmpty(pS))
return false;
Node *r = pS->pTop; // 暫存頂指標
pS->pTop = r->next; // 棧頂指標往下移一個結點
delete r; // 釋放空間
r = NULL; // 指向空
return true;
}
// 獲取棧頂元素:但不刪除棧頂結點
bool getTop(Stack *pS, int &val) {
if(isEmpty(pS)) // 棧空,返回0
return false;
val = pS->pTop->data;
return true; // 否則返回棧頂的元素值
}
// 獲取棧的長度
int getSize(Stack *pS) {
int len = 0;
Node *p = pS->pTop;
while(p != pS->pBottom) {
len++;
p = p->next;
}
return len;
}