進製轉化之遞迴 棧

2022-05-14 13:12:39 字數 1791 閱讀 8937

將10進製轉換成2進製,是除以2得到的餘數,再倒序排列,這可以用遞迴實現,也可以用資料結構——棧實現。

先看遞迴實現:

1 #include2

void to_two(int

num);

3int

main()410

/*遞迴實現把乙個數轉成16/8/2進製

*/11

//轉16/8/2進製分別求餘16/8/2,再除以16/8/2

12//

10 轉 2進製

13void to_two(int

num)

1421

else

2225 }

遞迴的實現方式,需要一定的邏輯性,如果把上述的列印函式和遞迴呼叫調換位置,輸出將反向。這裡對於遞迴的基礎知識不做解釋,如果忘記了,查詢相關資料。

這裡用遞迴能夠很好的實現把最後求出的數先列印出來,對於這種先進後出,後進先出的模型,很自然會想到棧的實現。

那麼,下面用陣列實現乙個棧,完成這個轉換:

1

/*main.c*/2

3 #include4 #include"

stack.h"5

intmain()6;

8for (int i = 0; i < 10; i++)

9 push(&selfstack, a[i]);

10while (!isempty(&selfstack))

1114

15return0;

16 }

1

/*stack.h*/2

3#pragma once

4 #include

5#define n 50

6 typedef int

mytype;78

struct

mystack ;

1213

struct mystack selfstack = ;

14int isempty(struct mystack *s);

15void setempty(struct mystack *s);

16int push(struct mystack *s, mytype data);

17 mytype pop(struct mystack *s);

1819

/*20

return 1: 是空棧 ;0:不是空棧

21*/

22int isempty(struct mystack *s)

2328

else

2932}33

/*34

沒有malloc,可以簡單這樣設定空棧

35*/

36void setempty(struct mystack *s)

3740

/*41

return 0,失敗,1,成功

可以看到,實現了陣列方式的棧,但這個方式存在一些問題,需要優化,還沒有達到專業軟體工程師的要求,後面會實現乙個基於表和另乙個基於陣列的棧的實現,那個時候將會做適當的調整。這個只是當做乙個大戰前的熱身。

用棧將遞迴轉化為非遞迴

在競賽中如果系統棧很小的話,過深的遞迴會讓棧溢位,這個時候我們就要自己手寫棧,將遞迴轉化成手工棧。方法其實也很簡單。基本思路上,我們就是用棧不斷的pop,push。但是何時push,何時pop呢?在 演算法導論 上對深度優先遍歷樹的講解中,在深度遍歷中,會對每個節點進行染色,白色為沒有被訪問過 灰色...

棧的基礎應用 2進製轉化10進製

今天還是看了一些關於棧的的問題,其中挑出乙個簡單的 關於進製轉換 如下 include include include define stack init size 20 define stackincreament 10 typedef char elemtype typedef struct s...

遞迴轉化成棧的非遞迴的區別

遞迴的 量比非遞迴的 量少 因為非遞迴需要額外的變數記錄當前所處的位置資訊,以及額外的控制語句。而遞迴所使用的方式是函式呼叫,這是非常自然的棧結構,遞迴每深入一層,棧的深度也會加一,而且當每一層的遞迴呼叫結束,都會自動返回上一層的遞迴中,不需要記錄位置資訊,不需要新增控制語句,這些工作都由函式呼叫的...