通过顺序栈来实现二进制向十进制、八进制的转化(c语言)

1.栈的定义、

堆栈又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2.代码详解

#define	 _CRT_SECURE_NO_WARNINGS

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

#define beginsize 20
#define addsize 10

typedef char elemtype;

typedef struct
{
	elemtype* top;
	elemtype* base;
	int sizelong;
}sqstack;

void init(sqstack* s)
{
	s->base = (elemtype*)malloc(beginsize * sizeof(elemtype));
	if (s->base == NULL)
	{
		exit(0);
	}

	s->top = s->base;
	s->sizelong = beginsize;
}

void push(sqstack* s, elemtype i)
{
	if (s->top - s->base >= s->sizelong)
	{
		s->base = (elemtype*)realloc(s->base, (s->sizelong + addsize) * sizeof(elemtype));
		if (s->base == NULL)
		{
			exit(0);
		}
	}
	*(s->top) = i;
	s->top++;
}

void pop(sqstack* s,elemtype* i)
{
	if (s->base == s->top)
	{
		return;
	}
	(*i) = *--(s->top);
}

int getlong(sqstack* s)
{
	return (s->top - s->base);
}

int main()
{
	elemtype n;
	sqstack s;
	int sum = 0;
	int len;

	init(&s);

	printf("输入一段二进制数,输入完成按下#\n");
	scanf("%c", &n);

	while (n != '#')
	{
		push(&s, n);
		scanf("%c", &n);
	}

	getchar();

	len = getlong(&s);

	for (int i = 0; i < len; i++)
	{
		pop(&s, &n);
		sum = sum + (n - '0') * pow(2, i);
	}

	printf("将二进制转化为10进制为%d\n", sum);

//

	printf("输入一段二进制数,输入完成按下#\n");

	sqstack s1, s2;
	elemtype m;

	init(&s1);
	init(&s2);

	scanf("%c", &m);

	while (m != '#')
	{
		push(&s1, m);
		scanf("%c", &m);
	}

	getchar();

	len = getlong(&s1);
	int p = 0;
	sum = 0;
	int count = 0;

	for (int i = 0; i < len; i++)
	{
		pop(&s1, &m);
		sum = sum + (m - '0') * pow(2, count);
		count++;
		if (count == 3 || s1.base == s1.top)
		{
			push(&s2, sum);
			sum = 0;
			count = 0;
		}
	}
	
	len= getlong(&s2);
	printf("将二进制转化为8进制为\n");

	for (int i = 0; i < len; i++)
	{
		pop(&s2, &m);
		printf("%d", m);
	}

	
	return 0;
}

  对于十进制比较简单没什么特别需要注意的,而对于8进制来说我们要两个栈一个用来存储原来数据一个用来存储改变后的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值