OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3540|回复: 3

栈的操作--将二进制数转化为十进制数输出

[复制链接]

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
发表于 2015-11-14 00:09:56 | 显示全部楼层 |阅读模式
#include"stdio.h"
#include"stdlib.h"//exit(0),malloc()
#include"math.h"//pow(int a ,int b);a的b次方
/*
将PC键盘输入的二进制数转化为十进制数输出,以“#”作为结束符;
将键盘输入的0或1视为字符,ACSII码字符0对应的十六进制数是0x48
*/
#define STACK_INIT_SIZE 20
#define STACKINCRESIZE  10
typedef char ElemType;//创建一个类型,下面凡事ElemType都代表char类型
//声明一个栈类型数据结构,元素是栈的3个基本要素
struct qstack
{
   ElemType  *top; //栈顶指针,字节指针
   ElemType  *base; //栈底指针
   int stacksize; // 栈的容量
};

//通过这个函数将栈的三要素进行初始化
void Stack_Iinit(qstack *s)
{
   s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
   if(!s->base)//如果内存分配失败
   {
     printf("内存分配失败!");
exit(0);//
   
   }
   s->top=s->base; //
   s->stacksize = STACK_INIT_SIZE;//

}

void push(qstack *s,ElemType e)//注意传入的类型
{
  if(s->top-s->base >= s->stacksize )//说明栈已经满了
  {
     s->base=(ElemType *)realloc(s->base,(STACK_INIT_SIZE+STACKINCRESIZE)*sizeof(ElemType));
//重新分配空间,注意空间加大了

  }
  *(s->top)=e;//
  s->top++;

}

void pop(qstack *s,ElemType *e)//将出栈数据放在e中,所以形参用指针为宜
{
if(s->top==s->base)//
{
   return;

}
*e=*--(s->top);//注意!括号不要搞错!否则结果出错!
}
//
int StackLen(qstack *s)
{
return (s->top-s->base);//栈的长度
}
//注意:用键盘输入“0”和“1”字符时,以“#”结束。比如输入:“1110#”按回车键就可以得出答案
void main()
{
    qstack s;
ElemType c;
int i,len,sum=0;
    Stack_Iinit(&s);
printf("请输入0或1字符,以#作为结束符\n");
scanf("%c",&c);//注意!本句表示一次输入一个字符
  /*
  注意:比如输入“1110010#”再按下回车键,字符串“1110010#”就以一次一个字符的顺序输入到PC键盘缓冲区即入栈;
  出栈时是以“后进先出”的顺序出栈,刚好最后入栈的字符就是二进制的最低位。对于栈的操作一定要注意入栈出栈顺序
*/ 
while(c!='#')
{
      push(&s,c);
 scanf("%c",&c);//这里为什么还要此句呢?因为scanf()一次只能输入一个字符,所以必须循环输入


}
getchar();//改变键盘输入缓存指针,即将回车键读出来,这样可以避免“\r”字符(回车键)输出
    len= StackLen(&s);
printf("当前栈的容量是:%d\n",len);
for(i=0;i<len;i++)
{
  pop(&s, &c );
  sum = sum + (c-48)*pow(2,i);//48对应ACSII码字符“0”;(c-48)的值要么是0要么是1字符
}
printf("转换的十进制数是:%d\n",sum);

}
手艺人要内外兼修。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-14 10:45:02 | 显示全部楼层
顶,先仰视一下楼主

对于最后for循环sum = sum + (c-48)*pow(2,i);这里的c-48是否正确?c的值为0或1,直接使用即可,减48是楼主混淆概念还是我错了

char c=1;  int a=1; 则是c等于a的,只有显示的时候才会用到c+48来显示1

谢谢分享~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2015-11-15 00:12:31 | 显示全部楼层
这是根据二进制转换十进制的转换公式来的,程序可以在vc6.0验证。
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

170

主题

917

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1824
金钱
1824
注册时间
2013-4-13
在线时间
63 小时
 楼主| 发表于 2015-11-15 00:20:13 | 显示全部楼层
这个例子主要是学习栈的知识,如何操作栈。其实可以输入一字符串,通过栈反序输出。c语言能力很重要!
手艺人要内外兼修。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表