金牌会员
- 积分
- 1824
- 金钱
- 1824
- 注册时间
- 2013-4-13
- 在线时间
- 63 小时
|
#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);
}
|
|