堆棧的簡單實現之二:進制轉換方面的簡單應用(C語言實現)

十進制數和其他進制數之間通常有很多種轉換方式,本文通過對堆棧的使用來實現十進制數和其他進制數之間的轉換。

如下圖所示是十進制轉二進制:


從上圖可以看出十進制數150經過轉化後變成二進制數10010110,對結果進行分析可以看出當商爲0時,把餘數按照倒序組合之後就是轉換的二進制數,通過分析發現這點和堆棧的後進先出的工作方式很想。可以想象,通過對給定的十進制數進行轉換,把每次的餘數壓到堆棧中,等轉換完畢就可以從堆棧中按照和剛纔壓入相反的順序把餘數讀出來,這樣正好就讀到了轉換後的進制數據。(注意:本應用以上篇博文爲基礎)


1、利用堆棧實現10進制數和任意其他進制的轉換

函數的具體實現如下:

/*	利用堆棧實現進制轉換
 *		dec  : 原始的10進制數
 *		base : 目標進制
 *		s    : 將轉換後的內容存到堆棧中
 *		返回值 : 0成功,其他失敗
 */
int stack_radix_conversion(int dec, int base, Stack *s)
{
	/* 判斷堆棧是否存在 */
	if(NULL == s)
	{
		return -1;
	}

	/* 初始化堆棧 */
	stack_init(s);

	/* 進行進制轉換 */
	while(dec)
	{
		if(stack_push(s, dec % base) == TRUE)
			dec = dec / base;
		else
			return -1;
	}

	return 0;
}

裏面需要調用堆棧的初始化函數stack_init(),這個函數來初始化堆棧的索引值爲0,它的具體實現如下:

/* 初始化堆棧
 *		s : 要初始化的堆棧
 */
void stack_init(Stack *s)
{
	s->top = 0;
}

2、按進制打印堆棧元素

如果是10進制以內,直接打印數值,如果是16進制則進行格式轉換,具體實現如下:

/*	按進制打印堆棧元素的函數
 *		s : 要打印的堆棧
 */
void stack_print_radix(Stack *s)
{
	int top = s->top;
	
	printf("Stack : ");
	while(top)
	{
		top = top - 1;
		if(s->items[top] < 10)
			printf("%d", s->items[top]);
		else
		{
			printf("%c", s->items[top] - 10 + 'A');
		}
	}
	printf("\n");
}

3、測試

通過控制檯輸入一個10機制樹,然後依次把這個數轉換成2進制,8進制,16進制,具體測試代碼如下所示:

/* 程序的入口函數 */
int main()
{
	int num;
	int ret;
	Stack *stack;

	printf("Input a number : ");
	scanf("%d", &num);

	/* 創建一個堆棧 */
	stack = stack_create();
	if(NULL == stack)
	{
		printf("stack_create error!\n");
		return -1;
	}

	printf("**************************  2  *************************\n");

	/* 轉換成二進制數 */
	ret = stack_radix_conversion(num, 2, stack);
	if(ret != 0)
	{
		printf("stack_radix_conversion for 2 radix is error!\n");
		return -1;
	}
	stack_print_radix(stack);

	printf("**************************  8  *************************\n");	

	/* 轉換成八進制數 */
	ret = stack_radix_conversion(num, 8, stack);
	if(ret != 0)
	{
		printf("stack_radix_conversion for 8 radix is error!\n");
		return -1;
	}
	stack_print_radix(stack);
	
	printf("************************** 16  *************************\n");

	/* 轉換成十六進制數 */
	ret = stack_radix_conversion(num, 16, stack);
	if(ret != 0)
	{
		printf("stack_radix_conversion for 16 radix is error!\n");
		return -1;
	}
	stack_print_radix(stack);

	/* 銷燬一個堆棧 */
	stack_destroy(&stack);
	
	return 0;
}
編譯並運行結果如下所示:


附錄:本文實現的完整代碼如下所示

#include <stdio.h>
#include <stdlib.h>

/* 定義堆棧的最大元素個數 */
#define MAX_ITEMS		20

/* 定義一個boolean型枚舉類型 */
typedef enum{FALSE, TRUE} boolean;

/* 定義一個表示堆棧的結構體 */
typedef struct
{
	int items[MAX_ITEMS];
	int top;
} Stack;

/* 創建一個堆棧 
 *		返回值 : 返回創建的堆棧結構體地址
 */
Stack *stack_create(void)
{
	Stack *s = malloc(sizeof(Stack));	// 分配一個堆棧空間
	if(NULL == s)	// 分配失敗
	{
		return NULL;
	}
	else	// 分配成功
	{
		s->top = 0;
		return s;
	}
}

/*	銷燬一個堆棧
 *		s : 要銷燬的堆棧的指針的指針
 */
void stack_destroy(Stack **s)
{
	if(NULL != *s)
	{
		free(*s);	// 執行銷燬操作
	}
}

/*	判斷堆棧是否爲空函數
 *		s : 表示要判斷的堆棧
 *		返回值: TRUE爲空,FALSE爲非空
 */
boolean stack_empty(Stack *s)
{
	if(s->top == 0) return TRUE;
	else return FALSE;
}

/*	判斷堆棧是否爲滿函數
 *		s : 表示要判斷的堆棧
 *		返回值: TRUE表示滿,FALSE表示非滿
 */
boolean stack_full(Stack *s)
{
	if(s->top == MAX_ITEMS) return TRUE;
	else return FALSE;
}

/*	向棧頂插入一個元素
 *		s : 要插入的堆棧
 *		item : 要摻入的元素
 *		返回值: TRUE成功,FALSE失敗
 */
boolean stack_push(Stack *s, int item)
{
	if(stack_full(s)) return FALSE;
	else	// 如果堆棧未滿
	{
		// 先將元素壓入堆棧,然後堆棧指針加一
		s->items[s->top] = item;
		s->top++;
		return TRUE;
	}
}

/*	將棧頂元素彈出
 *		s : 要操作的堆棧
 *		返回值: 返回彈出的值,爲0表示彈出失敗
 */
int stack_pop(Stack *s)
{
	if(stack_empty(s)) return 0;
	else	// 如果堆棧不爲空
	{
		s->top--;
		return s->items[s->top];
	}
}

/*	獲取棧頂元素
 *		s : 要操作的堆棧
 *		返回值 : 返回堆棧元素值,爲0表示獲取失敗
 */
int stack_get_top(Stack *s)
{
	if(stack_empty(s)) return 0;
	else	// 如果不爲空,返回堆棧的值
	{
		return s->items[s->top - 1];
	}
}

/*	打印堆棧元素的函數
 *		s : 要打印的堆棧
 */
void stack_print(Stack *s)
{
	int top = s->top;
	
	printf("Stack : ");
	while(top)
	{
		printf("%d ", s->items[--top]);
	}
	printf("\n");
}

/*	按進制打印堆棧元素的函數
 *		s : 要打印的堆棧
 */
void stack_print_radix(Stack *s)
{
	int top = s->top;
	
	printf("Stack : ");
	while(top)
	{
		top = top - 1;
		if(s->items[top] < 10)
			printf("%d", s->items[top]);
		else
		{
			printf("%c", s->items[top] - 10 + 'A');
		}
	}
	printf("\n");
}


/* 初始化堆棧
 *		s : 要初始化的堆棧
 */
void stack_init(Stack *s)
{
	s->top = 0;
}

/*	利用堆棧實現進制轉換
 *		dec  : 原始的10進制數
 *		base : 目標進制
 *		s    : 將轉換後的內容存到堆棧中
 *		返回值 : 0成功,其他失敗
 */
int stack_radix_conversion(int dec, int base, Stack *s)
{
	/* 判斷堆棧是否存在 */
	if(NULL == s)
	{
		return -1;
	}

	/* 初始化堆棧 */
	stack_init(s);

	/* 進行進制轉換 */
	while(dec)
	{
		if(stack_push(s, dec % base) == TRUE)
			dec = dec / base;
		else
			return -1;
	}

	return 0;
}

/* 程序的入口函數 */
int main()
{
	int num;
	int ret;
	Stack *stack;

	printf("Input a number : ");
	scanf("%d", &num);

	/* 創建一個堆棧 */
	stack = stack_create();
	if(NULL == stack)
	{
		printf("stack_create error!\n");
		return -1;
	}

	printf("**************************  2  *************************\n");

	/* 轉換成二進制數 */
	ret = stack_radix_conversion(num, 2, stack);
	if(ret != 0)
	{
		printf("stack_radix_conversion for 2 radix is error!\n");
		return -1;
	}
	stack_print_radix(stack);

	printf("**************************  8  *************************\n");	

	/* 轉換成八進制數 */
	ret = stack_radix_conversion(num, 8, stack);
	if(ret != 0)
	{
		printf("stack_radix_conversion for 8 radix is error!\n");
		return -1;
	}
	stack_print_radix(stack);
	
	printf("************************** 16  *************************\n");

	/* 轉換成十六進制數 */
	ret = stack_radix_conversion(num, 16, stack);
	if(ret != 0)
	{
		printf("stack_radix_conversion for 16 radix is error!\n");
		return -1;
	}
	stack_print_radix(stack);

	/* 銷燬一個堆棧 */
	stack_destroy(&stack);
	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章