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

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

#include <iostream>
using namespace std;

typedef struct Stack{
	int data;
	int length;
	Stack *next;
} StackNode, *LinkStack;

bool StackInit(LinkStack &S)      // 初始化函式,初始為空
{
	S = NULL;
	return true;
}
bool StackPush(LinkStack &S, int e)     // 入棧
{
	LinkStack p = new StackNode;	// 生成新節點
	p->data = e;	// 生成資料域
	if(S == NULL)   // 棧的長度加一
        p->length = 1;
    else
        p->length = S->length + 1;
	p->next = S;	// 插入在棧頂
	S = p;			// 修改棧頂, S 始終指向棧頂
	return true;
}
bool StackPop(LinkStack &S)     // 出棧
{
	LinkStack p = S;
	if(S == NULL)
		return false;
	else
	{
		S = S->next;    // 棧頂指標後移
		delete p;
		return true;
	}
}
int StackTop(const LinkStack &S)    // 取出棧頂元素
{
    if(S == NULL)
        return false;
    else
        return S->data;
}
int StackLength(const LinkStack &S)     // 求棧的長度
{
    if(S == NULL)
        return 0;
    else
        return S->length;
}
bool StackClear(LinkStack &S)       // 清空棧
{
    LinkStack p;
    while(S)
    {
        p = S;
        S = S->next;
        delete p;
    }
    return true;
}
void change(LinkStack &S, int n)      // 十進位制到二進位制轉換函式
{
    int e;
    do{
        e = n % 2;
        n = n / 2;
        StackPush(S, e);
    }while(n);
}

int main()
{
    int n;
    LinkStack S;    // 定義
    StackInit(S);   // 初始化
    while(cin >> n)
    {
        cout << "十進位制數:" << n << endl;
        cout << "對應二進位制:";
        change(S, n);
        int len = StackLength(S);       // 求出棧的長度
        for(int i = 0; i<len; i++)
        {
            cout << StackTop(S);        // 輸出棧頂元素
            StackPop(S);            // 彈出
        }
        cout << endl;
        StackClear(S);          // 清空
    }



	return 0;
}