十进制转换为其他进制(栈的c代码实现)

目录

题目

代码

1.全部代码

2.头文件和宏定义

3.主函数

4.核心函数

5.辅助函数

5.1构造一个空栈

5.2插入元素e为新的栈顶元素

5.3删除栈顶元素并返回

5.4判断是否为空栈


题目

将十进制数N转换为八进制数

代码

1.全部代码

#include<stdio.h>
#include<stdlib.h>//包含动态分配内存的库函数
#define STACK_INIT_SIZE 10//栈的初始容量
#define STACKINCREMENT 2//存储空间分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;//状态,函数返回值
typedef int SElemType;//栈元素
typedef struct
{
	SElemType* top, * base;//别忘了第二个*
	int stacksize;//栈的而当前容量
}SqStack;

void conversion();
Status InitStack(SqStack*);
Status Push(SqStack*, SElemType);
Status Pop(SqStack*, SElemType*);
int StackEmpty(SqStack);

int main()
{
	conversion();
	return OK;
}
//1.进制转换函数
void conversion()
{
	SqStack S;//为栈的信息存储分配存储空间
	InitStack(&S);//构造一个空栈S
	SElemType e;
	int N;
	printf("enter N:\n");
	scanf("%d", &N);
	while (N)//当该数或商为0时,代表已求得八进制数的最高非0位
	{
		Push(&S, N % 8);
		N = N / 8;
		printf("quotient:%d\n", N);
	}
	while (!StackEmpty(S))//若栈非空,删除栈顶元素并打印
	{
		Pop(&S, &e);
		printf("%d", e);
	}
}
//2.构造一个空栈S(*pS)
Status InitStack(SqStack* pS)
{
	pS->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!pS->base)exit(OVERFLOW);//存储空间分配失败
	pS->top = pS->base;//初始化栈的信息
	pS->stacksize = STACK_INIT_SIZE;
	return OK;
}
3.插入元素e为新的栈顶元素
Status Push(SqStack* pS, SElemType e)
{
	if (pS->top - pS->base >= pS->stacksize)//栈满,追加存储空间
	{
		pS->base = (SElemType*)realloc(pS->base,
			(pS->stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!pS->base)exit(OVERFLOW);//重分配失败,保持原来空间状态
		pS->top = pS->base + pS->stacksize;//更新栈顶指针
		pS->stacksize += STACKINCREMENT;//更新站的当前容量
	}
	*pS->top++ = e;//将元素e存入栈顶指针所知空间(变量)
					//再使pS->top+1
	return OK;
}
4.若栈不空,删除栈S的栈顶元素,用e返回其值,同时返回OK;否则返回ERROR
Status Pop(SqStack* pS, SElemType* p)
{
	if (!StackEmpty(*pS))
	{
		*p = *--pS->top;
		return OK;
	}
	else
		return ERROR;
}
5.若栈为空,返回TRUE(1),否则返回FALSE(0)
int StackEmpty(SqStack S)
{
	return S.top == S.base;//栈空的条件
}

2.头文件和宏定义

#include<stdio.h>
#include<stdlib.h>//包含动态分配内存的库函数
#define STACK_INIT_SIZE 10//栈的初始容量
#define STACKINCREMENT 2//存储空间分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef int Status;//状态,函数返回值
typedef int SElemType;//栈元素
typedef struct
{
	SElemType* top, * base;//别忘了第二个*
	int stacksize;//栈的而当前容量
}SqStack;

void conversion();
Status InitStack(SqStack*);
Status Push(SqStack*, SElemType);
Status Pop(SqStack*, SElemType*);
int StackEmpty(SqStack);

3.主函数

int main()
{
	conversion();
	return OK;
}

4.核心函数

//1.进制转换函数
void conversion()
{
	SqStack S;//为栈的信息存储分配存储空间
	InitStack(&S);//构造一个空栈S
	SElemType e;
	int N;
	printf("enter N:\n");
	scanf("%d", &N);
	while (N)//当该数或商为0时,代表已求得八进制数的最高非0位
	{
		Push(&S, N % 8);
		N = N / 8;
		printf("quotient:%d\n", N);
	}
	while (!StackEmpty(S))//若栈非空,删除栈顶元素并打印
	{
		Pop(&S, &e);
		printf("%d", e);
	}
}

5.辅助函数

5.1构造一个空栈

//2.构造一个空栈S(*pS)
Status InitStack(SqStack* pS)
{
	pS->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!pS->base)exit(OVERFLOW);//存储空间分配失败
	pS->top = pS->base;//初始化栈的信息
	pS->stacksize = STACK_INIT_SIZE;
	return OK;
}

5.2插入元素e为新的栈顶元素

3.插入元素e为新的栈顶元素
Status Push(SqStack* pS, SElemType e)
{
	if (pS->top - pS->base >= pS->stacksize)//栈满,追加存储空间
	{
		pS->base = (SElemType*)realloc(pS->base,
			(pS->stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!pS->base)exit(OVERFLOW);//重分配失败,保持原来空间状态
		pS->top = pS->base + pS->stacksize;//更新栈顶指针
		pS->stacksize += STACKINCREMENT;//更新站的当前容量
	}
	*pS->top++ = e;//将元素e存入栈顶指针所知空间(变量)
					//再使pS->top+1
	return OK;
}

5.3删除栈顶元素并返回

4.若栈不空,删除栈S的栈顶元素,用e返回其值,同时返回OK;否则返回ERROR
Status Pop(SqStack* pS, SElemType* p)
{
	if (!StackEmpty(*pS))
	{
		*p = *--pS->top;
		return OK;
	}
	else
		return ERROR;
}

5.4判断是否为空栈

5.若栈为空,返回TRUE(1),否则返回FALSE(0)
int StackEmpty(SqStack S)
{
	return S.top == S.base;//栈空的条件
}

说明

这个是《数据结构(C语言版)》严蔚敏里的算法,C代码实现。学习记录p48

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值