眾所周知,棧(stack)是限定僅在表尾進行插入或刪除操作的線性表,其特點是後進先出
允許刪除和插入的一端稱為棧頂(top),另一端稱為棧底(base)
根據這個特性,可以實現多種實際應用,本文跟大家分享十進位制轉換其他進製數和括號匹配檢驗的應用舉例
#include
using
namespace std;
#define ok 1
#define error 0
#define stack_init_size 100
//設定儲存空間初始分配量為100
#define stackincrement 10
//設定儲存空間分配增量為10
typedef
int status;
#define selemtype int
typedef
struct
sqstack;
//棧的定義
status initstack
(sqstack& s)
//建立空棧
int
stackempty
(sqstack s)
//判斷棧是否為空
intstackfull
(sqstack s)
//判斷棧是否滿
status push
(sqstack& s, selemtype e)
//入棧
*s.top++
= e;
//等價於 *s.top=e; s.top++;
return ok;
}
status pop
(sqstack& s,selemtype &e)
//出棧,並用e返回刪除值
status gettop
(sqstack s, selemtype& e)
//返回棧頂元素
此處說明,s.top指標是指向最上面乙個元素上面的乙個空間,是沒有資料值的,如圖:
對比入棧出棧和取棧頂元素
入棧時,對s.top先賦值,後自加
*s.top++
= e;
//等價於 *s.top=e; s.top++;
取棧頂元素,即取(s.top-1)的值
e =
*(s.top-1)
;
出棧時,先取棧頂元素,再自減
e=
*--s.top;
//相當於e=*(s.top-1); --s.top;
由於十進位制轉其他進製數的方法中,計算順序和輸出順序相反,故可以利用棧的「後進先出」的特點,來實現十進位制向其他進製的轉換。
思路如下:
初始化乙個棧,輸入乙個十進位制數
將十進位制數除以8,把餘數入棧
將商作為被除數,重複第一步,直到商為0
當商為0時,輸出棧
void
convert()
//將十進位制數轉換為八進位制數
while(!
stackempty
(s))
cout << endl;
}
本函式只識別兩種括號:"("、")"、"["、"]"
其他括號思路相同,以此類推
思路如下:
初始化乙個棧,輸入乙個括號序列
依次對括號序列中的字元進行如下判斷:
2.1 如果是左括號,則進棧,回到步驟2
2.2 如果是其他字元,則格式不正確。程式結束
2.3 如果是右括號,則取出棧頂元素判斷:
3.判斷棧是否為空棧,若為空,則括號序列格式正確,否則,格式錯誤
void
match()
else
if(a[i]
==')'
|| a[i]
==']')}
else
}else}if
(stackempty
(s)) cout <<
"匹配"
<< endl;
else cout <<
"不匹配"
<< endl;
}
int
main()
}return0;
}
執行如下
對於主函式中的switch語句,我存在以下未解決的問題:
我低頭幫陌生人拾起掉落的書的時候,心裡已經劃過了整個四季
陣列實現簡單的棧操作
微控制器開發過程中,常常會用到棧操作,例如多級選單的頁面跳轉,這裡分享乙個自己c語言寫的非常簡單的棧操作檔案供各位參考。include bsp user stk.h uint8 t stack stack size io static int top element 1 指向棧頂元素的指標 void...
用陣列實現棧的基本操作
給定乙個陣列,大小給定,用n表示,讓你設計個程式,用該陣列實現棧的基本操作 棧是先進後出,首先定義乙個變數index,代表如果放入乙個數 push操作 應該放到陣列的index位置 也代表當前棧中有幾個數 push操作 如果index等於陣列的大小,說明棧中數字滿了,給使用者報錯。否則,將這個數放入...
用棧實現佇列 用佇列實現棧
棧的特點 filo firstinlastout 僅能從棧頂插入,刪除元素。最基本的介面包括push 從棧頂壓入元素 pop 從棧頂彈出元素 佇列的特點 fifo firstinfirstout 僅能從隊頭刪除元素,從隊尾插入元素。最基本的介面包括enque 從隊尾插入元素 deque 從隊頭刪除元...