數據結構之順序棧實現進制轉換


棧的應用

進制轉換

  • 1.需要用到前面博文順序棧基本操作

示例:

#include <iostream>
#include <stdio.h>

using namespace std;

#define STACK_INT_SIZE 10 //存儲空間初始分配量
#define STACK_INTCREMENT 2 //存儲空間分配增量
#define N 16   //定義待轉換的進制N

typedef int SElemType;

struct SqStack {
	SElemType *base; //在構造之前和銷毀后,base的值為NULL
	SElemType *top;  //棧頂指針
	int stacksize;   //當前已分配的存儲空間,以元素為單位
}; //順序棧

//順序棧的基本操作
void InitStack(SqStack &S)
{
	//構造一個空棧
	if (!(S.base = (SElemType*)malloc(STACK_INT_SIZE * sizeof(SElemType)))) {
		return;
	}

	S.top = S.base;
	S.stacksize = STACK_INT_SIZE;
}


void DestoryStack(SqStack &S)
{
	//銷毀S
	free(S.base);
	S.base = NULL;
	S.top = NULL;
	S.stacksize = 0;
}

void ClearStack(SqStack &S)
{
	//把S置為空棧
	S.top = S.base;
}

int StackEmpty(SqStack S)
{
	if (S.top == S.base)
	{
		return 1;
	}
	else {
		return 0;
	}
}

int StackLength(SqStack S)
{
	//返回S的元素個數,棧的長度
	return S.top - S.base;
}


int GetTop(SqStack S, SElemType &e)
{
	//如果棧不空,則用e返回S的棧頂元素,返回值為1
	//否則返回值為0
	if (S.top > S.base)
	{
		e = *(S.top - 1);
		return 1;
	}
	else {
		return 0;
	}

}


void Push(SqStack &S, SElemType e)
{
	//插入元素e為新的棧頂元素
	if (S.top - S.base >= S.stacksize) //棧滿,分配空間
	{
		S.base = (SElemType *)realloc(S.base, (S.stacksize + STACK_INTCREMENT) * sizeof(SElemType));
		if (!S.base)
			return;
		S.top = S.base + S.stacksize;
		S.stacksize += STACK_INTCREMENT;
	}
	*(S.top)++ = e;
}

int Pop(SqStack &S, SElemType &e)
{
	//若棧不空,刪除棧S的棧頂元素,用e返回,返回值1
	//若棧空,返回0
	if (S.top == S.base)
		return 0;
	e = *--S.top;
	return 1;
}

void StackTraverse(SqStack S, void(*visit)(SElemType))
{
	//從棧底到棧頂依次對棧中的每個元素調用visit()
	while (S.top > S.base)
	{
		visit(*S.base++);
	}
	printf("\n");
}

void print(SElemType e)
{
	printf("%d\n", e);
}


void Conversion(void) {
	SqStack s;
	unsigned int n;
	SElemType e;
	InitStack(s); // 初始化棧
	printf("將十進制整數n轉換為%d進制數,請輸入:n(>=0)=", N);
	scanf_s("%u", &n); // 輸入非負十進制整數n
	while (n)
	{
		Push(s, n%N); // 入棧n除以N的余數(N進制的低位)
		n = n / N;
	}

	while (!StackEmpty(s))  //當棧不空
	{
		Pop(s,e);  // 彈出棧頂元素且賦值給e
		
#if 1  //16進制轉換
		if (e <= 9) {
			printf("%d", e); //輸出e
		}
		else
		{
			printf("%c", e+55); //// 大於9的余數,輸出相應的字符
		}
#endif
		
	}

	printf("\n");
}

int main(void)
{
	Conversion();
	system("pause");
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM