用栈实现2进制数到十进制数的转换

问题:用栈实现2进制数到十进制数的转换

解析:用到<math.h>库中的pow函数,pow(2,i)表示2^i。当进行形参到实参的传送时,需要改变栈中的元素时传入&s,当不改变栈中元素,只对栈s进行操作时,传入s

代码实现:

/*利用栈的特点将2进制数转换为10进制数 */
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ElemType char
#define Init_Stack_Size 30//当前栈的最大存储容量
#define IncreasmentSize 1 //每次增加的大小
typedef struct SqStack *LinkStack;
typedef struct SqStack
{
	ElemType *base;
	ElemType *top;
	int initSize;
}SqStack;

//初始化栈
void InitStack(SqStack *s)
{
	s->base = (LinkStack)malloc(Init_Stack_Size * sizeof(ElemType));
	if(!s->base)
	{
		printf("栈空间分配失败···\n");
		exit(0);
	}
	s->top = s->base;
	s->initSize = Init_Stack_Size;
} 

//入栈操作
void Push(SqStack *s,ElemType *e)
{
	if((s->top - s->base) >= s->initSize - 1)
	{
		s->base = (LinkStack)realloc(s->base,(s->initSize + IncreasmentSize)*sizeof(ElemType));
		if(!s->base)
		{
			exit(0);
		}
		s->initSize = s->initSize + IncreasmentSize;
	}
	*s->top = *e;
	s->top++;
} 

//出栈操作
void Pop(SqStack *s,ElemType *e)
{
	if(s->top == s->base)
	{
		return;
	}
	s->top--;
	*e = *s->top;
} 

//求栈的长度
int StackLen(SqStack *s)
{
	return (s->top - s->base);
}
//2进制转换为10进制
void Bin2Dec(SqStack s)
{
	int i,len;
	long int sum = 0;
	ElemType c,e;
	InitStack(&s);
	printf("请输入您要转换的二进制数,输入字符 ‘#‘结束:\n");
	scanf("%c",&c);
	while(c != ‘#‘)
	{
		Push(&s,&c);
		scanf("%c",&c);
	}
	getchar();//必须要有一个getchar(),因为输入时要输入enter键表示输入完成,如果没有这一句,enter键将被当做字符‘\n‘输入,影响结果
	len = StackLen(&s);
//	printf("%d\n",len);
	for(i = 0;i < len;i++)
	{
		Pop(&s,&e);
		sum = sum + (e-48) * pow(2,i);//这里要注意e是字符型的,0的ASCII码为48,1的ASCII码为49,要转换一下 才能进行运算
//		printf("%c",e);
	}
	printf("转换后的十进制数为:%ld\n",sum);
}

int main()
{
	int i,j;
	SqStack s;
	InitStack(&s);
	Bin2Dec(s);
	getch();
	return 0;
}

  

时间: 2024-10-13 02:29:18

用栈实现2进制数到十进制数的转换的相关文章

C语言实现字符串中(10进制和16进制)转成十进制数

如何将字符串中的10进制数和16进制数提取出来,看以下代码: #include <stdio.h> typedef char TUINT8 ; typedef int TUINT32; TUINT32 Read_DecNumber(const TUINT8* str); TUINT32 Read_HexNumber(const TUINT8* str); int main(void) { int ret = Read_DecNumber("1000"); int d = R

数据结构实验之栈一:进制转换(栈的应用)

 数据结构实验之栈一:进制转换 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 输入一个十进制整数,将其转换成对应的R(2<=R<=9)进制数,并输出. 输入 第一行输入需要转换的十进制数: 第二行输入R. 输出 输出转换所得的R进制数. 示例输入 1279 8 示例输出 2377 提示 来源 示例程序 后台数据太水,按理说应该考虑零的情况,但是你不判断零也是对的. #include <stdio.h> #i

判断一个数的n进制是不是回文数

#include<stdio.h> int circle(int m,int n)//该函数判断m的n进制数是否为回文数 { int s=0,l=m; while(l) { s=s*n+l%n;//该语句是反顺序计算数值 l/=n; } return s==m;//如果是回文数,那么正反顺序的数字应该是相等的 } void main() { int num[]={434,783,909}; int sys[]={2,8,10,16}; int i,j; for(i=0;i<3;i++)

java-十进制、八进制、十六进制数互相转换

java-十进制.八进制.十六进制数互相转换下面是一个十进制.八进制.十六进制数互相转换的小程序public class JZTurn {?????public static void main(String[] args) {????????int num2 = 1314521;????????System.out.println("十进制数:"+num2);????????System.out.println("十进制转换二进制:"+turn2(num2));?

进制(二进制、十进制、八进制、十六进制)

对于整数,有四种表示方式: 二进制:0,1 ,满2进1.以0b或0B开头. 十进制:0-9 ,满10进1. 八进制:0-7 ,满8进1. 以数字0开头表示. 十六进制:0-9及A-F,满16进1. 以0x或0X开头表示.此处的A-F不区分大小写. 如:0x21AF +1= 0X21B0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 A B C D E F 1.原码.反码.补码   所有数字在计算机底层都以二进制形式存在.  计

C#Winform基础 八进制数转换为十进制数(无符号,整数,正数)

镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 1 UI 2 code 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using S

将八进制数转换为十进制数——java

import java.util.Scanner; /* * 编写方法,将八进制数转换为十进制数.Integer.valueOf("876",8).toString() * */ public class OctalToDecimal { public static void main(String[] args) { String oldValue; System.out.print("Input the an Octal number:"); oldValue

将网络流中用两个字节16进制表示的资源数(如DNS)和长度转换为整形

由于在网上搜索一直没有找到结果,而直接用指针强制转换的方法,却会导致高八位和第八位倒过来的错误,于是冥思苦想自己写了一个 思想大致如下: 用u_int16_t的2字节16位的整形变量来存储这个整数,首先将第一个字节和该变量进行或运算,运算结果左移八位,于是刚才的第一个字节结果就到了高八位,然后在与第二个字节进行或运算尽可以了代码如下: u_int16_t convert16(u_char *p) { u_int16_t tmp = 0; tmp |= p[0]; tmp <<= 8; tmp

ACM--26进制加法--HDOJ 2100--Lovekey--大数--字符串处理

HDOJ题目地址:传送门 Lovekey Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7783    Accepted Submission(s): 2519 Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26