一、要求:
1)輸入乙個十進位制數,利用棧操作,將該數轉換成n進製數。
2)輸入乙個表示式,表示式中包括三種括號「()」、「」和「{}」,判斷該表示式的括號是否匹配。
二、思路:
1)進製轉換
任意乙個十進位制正整數n,都能轉化為乙個d進製正整數。該演算法基於原理n=(n/d)*d+n%d 。在n不為0的前提下,執行迴圈操作:
讓n%d的結果入棧,並執行n=n/d改變n值。
計算結束後,再將棧中的元素依次出棧,即可得到從高位到低位的輸出結果。此處要考慮兩種情況,一種是將十進位制轉為低於10的進製的情況,另一種是高於10的進製的情況。
2)判斷括號是否匹配
設定乙個空棧,掃瞄給定的表示式,若遇到左括號則將其入棧等候配對,若遇到右括號,首先判斷棧是否為空,若為空,說明給定的表示式中右括號多了;若不為空,則將棧頂元素(左括號)出棧,讓其與右括號配對。當給定的表示式掃瞄結束後,若棧空,說明給定的表示式中括號匹配,若棧非空,說明給定的表示式中左括號多了,表示式中的括號不匹配。
三、**和結果:
1)進製轉換:
#include
#include
#define stackinitsize 100
//初始大小
#define stackincrement 10
//儲存空間增量
typedef
struct
sqstack;
//順序棧的型別
//******初始化********//
void
initstack
(sqstack &s)
//********判空**********//
intstackempty
(sqstack s)
//********入棧 ********//
void
push
(sqstack &s,
int e)
s.base[s.top++
]= e;
}//*********出棧********//
void
pop(sqstack &s,
int&e)
//*******十進位制正整數轉換為d進製正整數*********//
void
conversion
(sqstack &s,
int n,
int d)
while(!
stackempty
(s))
}void
main()
結果:
轉為16進製制:
2)判斷括號是否匹配
#include
#include
#define stackinitsize 100
//初始大小
#define stackincrement 10
//儲存空間增量
typedef
struct
sqstack;
//順序棧的型別
//******初始化********//
void
initstack
(sqstack &s)
//********判空**********//
intstackempty
(sqstack s)
//********入棧 ********//
void
push
(sqstack &s,
char e)
s.base[s.top++
]= e;
}//*********出棧********//
void
pop(sqstack &s,
char
&e)//*******判斷括號是否匹配********//
intbracketscheck
(sqstack &s,
char
*str)'||
*p==
']'||
*p==
')')
'&& ch !=
' p++;}
if(!stackempty
(s))
//左括號多
return0;
return1;
}void
main()
結果:
**僅代表本人初識資料結構時思路。
資料結構 棧與佇列
題目 1.編寫函式,採用鏈式儲存實現棧的初始化 入棧 出棧操作 2.編寫函式,採用順序儲存實現棧的初始化 入棧 出棧操作 3.編寫函式,採用鏈式儲存實現佇列的初始化 入隊 出隊操作 4.編寫函式,採用順序儲存實現佇列的初始化 入隊 出隊操作 5.編寫乙個主函式,在主函式中設計乙個簡單的選單,分別除錯...
資料結構 棧與佇列
棧的原則是後進先出,即插入與刪除元素均在棧頂進行。獲取棧頂元素 s.top 佇列的原則是先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行。獲取隊頭元素 q.front 思路 用兩個棧,乙個棧用來進隊,乙個棧用來出隊,當資料進入佇列的時候,我們將其壓入乙個棧,當資料出隊的時候,我們將儲存在棧內的資料...
資料結構 棧與佇列
1.順序棧 基本操作 typedef int elemtype 定義 順序棧 typedef struct sqstack 判空 bool stackempty sqstack s 進棧 bool push sqstack s elemtype x 出棧操作 bool pop sqstack s e...