栈的LIFO特点:
我们知道“栈”这种数据结构具有后进先出(LIFO)的特点,也就是最后入栈的数据最先被弹出。那这跟进制转换有什么关系呢?
进制转换原理:
假如我们从键盘输入一个二进制数1101,先看人工是如何转换成十进制的?我们只需要将二进制不同位上的数乘上它相应的权值即可,也就是1*2^0+0*2^1+1*2^2+1*2^3=13。也就是最后被输入的数字权值最低。所以用计算机模拟的话,就是利用栈的LIFO特点将数字一个一个的弹出,再乘上相应的权值,最后相加。
代码如下:
///利用栈的LIFO特点将二进制转化为十进制
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
void InitStack(sqStack *s) //创建一个栈并初始化
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s->base)
{
exit(0);
}
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
}
void Push(sqStack *s, ElemType e) //压栈操作
{
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
if (!s->base)
{
exit(0);
}
}
*(s->top) = e;
s->top++;
}
void Pop(sqStack *s,ElemType *e) //弹栈操作
{
if(s->top == s->base)
{
return;
}
*e = *--(s->top);
}
int StackLen(sqStack s) //获取栈的当前容量
{
return (s.top - s.base);
}
main() //主函数
{
ElemType c;
sqStack s;
int len,i,sum=0;
InitStack(&s);
printf("Please input a binary number,end with #:\n");
scanf("%c",&c);
while(c != '#')
{
Push(&s,c);
scanf("%c",&c);
}
getchar(); //将输入完成后的回车(‘/n‘)从键盘缓冲区取出,避免造成下次输入时程序混乱
len = StackLen(s);
printf("The length of current stack is :%d\n",len); //输出当前栈的长度
for (i =0;i < len;i++)
{
Pop(&s,&c);
sum = sum + (c-48)*pow(2,i);
}
printf("The decimal number is :%d\n",sum);
return 0;
}
结果展示: