1. 程式人生 > >用棧實現十進位制到二進位制的轉換

用棧實現十進位制到二進位制的轉換

/* 棧,先進後出 */

#include<stdio.h>
#include<malloc.h>
#define N 1  //初始化記憶體大小,以元素為單位 
#define M 1  //記憶體擴增,以元素為單位 


struct stack {
	int *base;
	int *top; 
	int n;  //記錄棧的記憶體大小,以元素為單位 
};


struct stack S;

void initStack();
void push(int e);
void getTop(int &e);
void delTop(int &e);
int length();


void main() {
	int a, m, num, i;
	initStack();
	for(i=1; i<=3; i++) {
		printf("請任意輸入一個十進位制數:\n");
			scanf("%d", &num);
		while(num != 0) {
			m = num%2;
			push(m);
			num /= 2;
		}
		printf("對應得二進位制為:");
		while(S.n != 0) {
			delTop(a);
			printf("%d", a);
			S.n --;
		}
		printf("\n");
	}
}

/*初始化一個棧*/
void initStack() {
	//構造一個空棧S
	S.base = (int *)malloc(N*sizeof(int));
	if(!S.base) {
		printf("error");
 		return;
 	}
	S.top = S.base;
	S.n = N; //初始化棧記憶體大小 
} 

/*插入新的棧頂元素*/ 
void push(int e) {
	//插入元素e為新的棧頂元素
	if(S.top-S.base >= S.n) {//記憶體不足,自動追加
		S.base = (int *)realloc(S.base, (S.n + M)*sizeof(int)); 
		if(!S.base) {
			printf("error");
			return;
		}
		S.top = S.base + S.n; // 
		S.n += M;	
	} 
	*S.top++ = e;/*棧頂指標的內容為空(看書上圖),將e賦給它,然後top加1*/ 
}


/*取出棧頂元素*/
void getTop(int &e) {
	//若棧不為空,用e返回大小
	if(S.top == S.base) {
		printf("error");
		return;
	} 
	e = *(S.top - 1);
}



/*刪除棧頂元素*/
void delTop(int &e) {
	if(S.top == S.base) {
		printf("error");
		return;
	}
	e = *--S.top;/*top指標先減1以指向棧頂元素(top指標實際並不是指向棧頂元素)
	將棧頂元素返回後,top指標減1*/ 
} 


/*棧中的元素個數*/
int length() { 
	if(S.top == S.base)
		return 0;
	return (S.top-S.base)/M - 1;
}