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