数据结构-栈--进制转换

#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACK_INCREMENT 2 /* 存储空间分配增量 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef struct SqStack
{
	int *base; /* 在栈构造之前和销毁之后,base 的值为 NULL */
	int *top; /* 栈顶指针 */
	int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
void InitStack(SqStack *s)
{ /* 构造一个空栈 S */
	s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
	if(!s->base)
		exit(OVERFLOW); /* 存储分配失败 */
	s->top=s->base;
	s->stacksize=STACK_INIT_SIZE;
}
int StackEmpty(SqStack s)
{ /* 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE */
	if(s.top==s.base)
		return TRUE;
	else
		return FALSE;
}
int StackLength(SqStack s)
{ /* 返回 S 的元素个数,即栈的长度 */
	return s.top-s.base;
}
void Push(SqStack *s,int e)
{ /* 插入元素 e 为新的栈顶元素 */
	if(s->top-s->base>=s->stacksize) /* 栈满,追加存储空间 */
	{
		s->base=(int *)realloc(s->base,(s->stacksize+STACK_INCREMENT)*sizeof(int));
		if(!s->base)
			exit(1); /* 存储分配失败 */
		s->top=s->base+s->stacksize;
		s->stacksize+=STACK_INCREMENT;
	}
	*(s->top)++=e;//*s->top=e;s->top++;
}
int Pop(SqStack *s,int *e)
{ /* 若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则
返回 ERROR */
	if(s->top==s->base)
		return ERROR;
	*e=*--s->top;
	return OK;
}
void DestoryStack(SqStack *s)
{
	if(s->base)
		free (s->base);
}
void conversion(int i)
{ /* 对于输入的任意一个非负 10 进制整数,打印输出与其等值的 16 进制数 */
	SqStack s;
	int n; /* 非负整数 */
	int e;
	InitStack(&s); /* 初始化栈 */
	printf("将 10 进制整数 n 转换为 %d 进制数\n 请输入 n( >0 ):",i);
	scanf("%d",&n); /* 输入非负十进制整数 n */
	while(n) /* 当 n 不等于 0 */
	{
		Push(&s,n%i); /* 入栈 n 除以 i 的余数(i 进制的低位) */
		n=n/i;
	}
	while(!StackEmpty(s)) /* 当栈不空 */
	{
		Pop(&s,&e); /* 弹出栈顶元素且赋值给 e */
		if(e<=9)
		printf("%d",e);
		else
		printf("%c",e+55); /* 大于 9 的余数,输出相应的字符*/
	}
	printf("\n");
	DestoryStack(&s);
}

int menu()
{
	int i;
	while(1)
	{
		puts("\t*************进制转换**************");
		puts("\t\t1. 10进制转换成2进制");
		puts("\t\t2. 10进制转换成8进制");
		puts("\t\t3. 10进制转换成16进制");
		puts("\t\t0. 退出");
		printf("\t请输入指令:");
		scanf("%d",&i);
		system("cls");
		switch(i){
			case 1:
				conversion(2); break;
			case 2:
				conversion(8); break;
			case 3:
				conversion(16); break;
			case 0:
				return 0;
		}
	}
}

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值