十進位制轉換任意進位制--鏈棧實現

悠閒小人物發表於2020-10-22

首先,先了解一下c語言const用法
修飾區域性變數,int const a = 9; const int b = 8;這兩種寫法是一樣的,表示a和b都是常量,不可改變。需要注意的是,用const修飾變數時,一定要給變數初始化,否則之後就不能再進行賦值了。

完整程式碼如下:

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

const char f[]="0123456789ABCDEF";//定義一個全域性常量 ,方便匯出十進位制以上的不為數字形式的資料的顯示 

typedef struct StackNode //建立鏈式棧的結構體 
{
	char data;//棧的資料域,為了方便設定成char型別 
	struct StackNode *next; //棧的指標域 
}SqStack,*LinkStack;

void InitStack(LinkStack &S)//棧的初始化,只有建立一個棧頂結點這一步 
{
	S = (SqStack*)malloc(sizeof(SqStack));//建立一個野結點,使其為NULL,便成為棧頂結點。 
	S = NULL;
}

int Push(LinkStack &S,char e)//進棧 
{
	SqStack* p;//定義一個野結點 
	p = (SqStack*)malloc(sizeof(SqStack));
	p->data = e;//使該結點裝上資料元素e,並使其next等於S,類似於連結串列的頭插法 
	p->next = S;
	S = p;//棧頂結點S,一直在棧的最前方 
	return 0; 
}

void Pop(LinkStack &S)//使棧頂元素出棧,並返回棧頂元素 
{
	if(S==NULL)//判斷棧是否為空 
	{
		printf("棧空!");
	}
	else
	{
		SqStack* p;//這裡定義一個結點,方便後面對棧頂結點的釋放 
		printf("%c",S->data);//輸出棧頂資料 
		p = S;
		S = S->next;//使棧頂結點指向下一個結點,類似於棧減一 
		free(p);//釋放棧頂元素 
	}	
}

void Decimal(LinkStack S)//十進位制轉換任意進位制函式 
{
	int n,//輸入的十進位制數 
		m,//輸入的要轉的進位制 
		i=0;//記錄次數變數 
	printf("請輸入一個十進位制數: ");
	scanf("%d",&n);
	while(1)//用於檢測換行符,使函式脫離scanf的連續輸出 
		if(getchar()=='\n')
			break;
	printf("請輸入要轉的進位制: ");
	scanf("%d",&m);
	while(n)//迴圈終止條件是n為0 
	{
		Push(S,f[n%m]);//進棧,進的是char型 
		n=n/m;
		i++;//記錄迴圈次數,方便出棧 
	}
	printf("結果:");
	while(i--) //出棧操作 
		Pop(S);
}

int main()
{
	LinkStack S;
	InitStack(S);//定義一個棧,並初始化 
	Decimal(S);//進位制轉換函式 
	return 0;
}

(完)

相關文章