利用棧進行數制轉換和括號匹配(C語言)

2021-09-22 18:30:53 字數 1746 閱讀 4611

數制轉換:將十進位制數轉換為任意進製數。由數制轉換的計算公式 n = (n / d) × d + n % d (其中n為想轉換的十進位制數,d為想轉換的進製) 我們可以知道其轉換後的結果是逆序輸出,故可以利用棧的先進後出的特性,將每一步計算的結果依次入棧之後再出棧,得出的結果正好是轉換後的數。

括號匹配:即利用棧檢驗輸入的括號是否正確配對,包括了三種括號的匹配,即( )、[ ]、。其巢狀的順序隨意,即 [ ( ) ] 或 等為正確匹配,而如果交叉如 [ ( ] ) 或 等則匹配失敗。

利用棧來實現其具體思想為:初始化乙個棧,依次讀取輸入的括號,若為左括號,則將括號壓入棧中;若為右括號,則取棧頂的元素,將該元素與右括號進行配對,若配對成功,則彈出該棧頂元素。繼續進行下乙個括號的讀取與判斷,若讀取完輸入的括號之後棧為空,則證明壓入的元素已全部彈出,即全部匹配完成;若棧不為空,則匹配失敗。

**如下:

(注:進行括號匹配時將主函式中數制轉換部分的**注釋掉即可)

#include

#include

#include

#include

typedef

int elemtype;

#define stack_int_size 100

typedef

struct

seqstack;

/*棧的初始化*/

void

initstack

(seqstack *s)

s->top=-1

; s->stacksize=stack_int_size;

}/*銷毀棧*/

void

destroystack

(seqstack *s)

}/*判斷棧空*/

bool isempty

(seqstack *s)

/*判斷棧滿*/

bool isfull

(seqstack *s)

/*取棧頂元素*/

elemtype gettop

(seqstack *s)

else

}/*元素入棧*/

void

push

(seqstack *s,elemtype e)

else

}/*元素出棧*/

void

pop(seqstack *s,elemtype *e)

else

}/*輸出棧元素*/

void

printstack

(seqstack *s)

else

}printf

("\n");

}/*數制轉換*/

void

conversion

(int num,

int r)

while(!

isempty

(&s))}

/*括號匹配*/

void

bracketmatch

(char str)

':e=

gettop

(&s);if

(e =='}

if(isempty

(&s)

)//若棧為空,則元素已匹配完,故匹配成功

printf

("括號匹配成功\n");

else

printf

("括號匹配失敗\n");

}int

main()

利用堆疊進行數制轉換

下面以無符號十進位制轉換為八進位制為例簡述數制轉換問題。將十進位制數num轉換為八進位制可以反覆執行以下步驟得到 1,將num除以8,取其餘數 2,判斷num除以8的商 若商為零,則轉換到此結束 若商不為零,則將商送num,轉到第1步。演算法描述如下 將無符號十進位制數轉換為八進位制數 堆疊採用順序...

資料結構 利用棧進行數制轉換的實現

程式如下 當程式執行後,比如數個1348,結果無限返回2,是什麼問題呢,跪求大佬。include include define stack init size 100 define stackincrement 10 typedef int elemtype typedef int status u...

C語言中利用棧檢測括號是否匹配

檢測括號是否匹配的演算法中,棧的特性是最符合括號特點的。棧的先進後出將括號的匹配正好完美實現。思想 從字串開頭向後逐個檢測,檢測到除括號外的元素就跳過。檢測到左括號時,就進行入棧操作,繼續向後檢測。檢測到有括號時,就檢查棧頂元素是否是匹配的左括號。若不匹配,則直接返回錯誤訊號,使程式結束 若匹配,進...