1. 程式人生 > >數制轉換2(利用棧)

數制轉換2(利用棧)

/*
題目:數制轉換(通過棧這個資料結構來求解)
內容:輸入M進位制的數x,輸出N進位制的數。
作答者:小白楊
收穫:1、棧這種資料結構,只允許在棧頂進行出棧入棧操作。
2、先構造出棧的基本結構,然後初始化一個棧
再勾勒出入棧和出棧的函式
再輸入M進位制的數x,轉換為int型入棧
再出棧的同時將M進位制的數轉換為十進位制,然後將此十進位制的數轉換為N進位制併入棧儲存,然後出棧並轉換為字元輸出
3、棧,其實就是一個動態的陣列
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACKSIZE 100
#define STACKINCR 10
#define OK 1
#define ERROR -1

typedef int elemint;

//構造棧的基本結構
typedef struct{
	int *top;
	int *base;
	int stacksize;
}Number;

//棧的初始化
int initstack(Number &s)
{
	s.base = (elemint *)malloc(STACKSIZE * sizeof(elemint));
	if (!s.base)
		return ERROR;
	s.top = s.base;
	s.stacksize = STACKSIZE;
	return OK;
}

//入棧
int push(Number &s, elemint e)
{
	if (s.top - s.base >= s.stacksize)
	{
		s.base = (elemint *)realloc(s.base, (STACKSIZE + STACKINCR)*sizeof(elemint));
		if (!s.base)
			return ERROR;
		s.top = s.base + s.stacksize;
		s.stacksize += STACKINCR;
	}
	*(s.top) = e;
	s.top++;
	return OK;
}

//出棧
void pop(Number &s, elemint &e)
{
	if (s.base != s.top)
	{
		e = *s.top;
		s.top--;
	}
	else
		printf("棧為空\n");
}

//字元資料轉換為數值資料
void char_to_num(char e, elemint &n)
{
	if (e >= '0'&&e <= '9')
		n = e - '0';
	else
		n = e - 'A' + 10;
}
//數值資料轉換為字元資料
void num_to_char(elemint n, char &e)
{
	if (n >= 0 && n <= 9)
		e = n + '0';
	else
		e = n - 10 + 'A';
}

//原始進位制資料入棧
void numpush(Number &s)
{
	int m, n, i, j;
	char a[50] = {0};

	printf("請輸入原始資料進位制:\n");
	scanf_s("%d", &m);
	printf("請輸入要轉換成的進位制:\n");
	scanf_s("%d", &n);
	printf("請輸入原始資料:\n");
	scanf_s("%s",a,50);

	for (i = 0; a[i] != '\0'; i++)  //將原始資料一一從字元轉換數值入棧 
	{
		char_to_num(a[i], j);
		push(s, j);
	}
	push(s, m);
	push(s, n);
}

//利用棧這個資料結構的存進存出為軸,進行數制轉換
void charpop(Number &s)
{
	int m, n, z = 0, t = 1, i;
	char e;
	pop(s, n);
	pop(s, m);
	//將資料出棧並轉換為十進位制
	while (s.top != s.base)
	{
		pop(s, i);
		z = z + t*i;
		t = t*m;
	}

	//將資料從十進位制轉換為N進位制併入棧儲存
	while (z != 0)
	{
		i = z%n;
		push(s, i);
		z = z / n;
	}

	//將資料出棧並轉換為字元資料輸出
	while (s.base != s.top)
	{
		pop(s, i);
		num_to_char(i, e);
		printf("%c", e);
	}
	printf("\n");
}

void main()
{
	Number s;
	initstack(s);
	numpush(s);
	charpop(s);
	system("pause");
}