數制轉換2(利用棧)
阿新 • • 發佈:2018-12-17
/* 題目:數制轉換(通過棧這個資料結構來求解) 內容:輸入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"); }