找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3681|回复: 1
收起左侧

栈的操作--将二进制数转化为十进制数输出-C语言教程

[复制链接]
ID:99624 发表于 2015-12-20 02:48 | 显示全部楼层 |阅读模式
//  这是一个“栈”操作的例子源码:

#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);

}

/////////////////////////////////////-----------------GKXW---------2015年11月14日 00:03:08--//////////////////////////////////////////



     栈(stack)是一种“后进先出”的数据结构,属于线性表的一种,只能在一头操作。在现实生活中应用很大,多学习一种数据结构就意味着多一种能力。本来是要分析uc/os-ii操作系统的,但是由于在学习STeMwin的时候涉及到文件系统的操作,所以就专门学习了C语言文件部分内容。计划不得不推迟了。程序好不好关键就看数据结构用得合不合理,编程实际上就是数据的怎样存储,以什么数据结构存储的问题。《数据结构与算法》是修炼内功的,是对计算机语言学习的一种提高。

      




回复

使用道具 举报

ID:851371 发表于 2020-11-29 21:46 | 显示全部楼层
非常感谢  让我对其中有些语句更加明白了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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