栈是作为一种限定线性表,只允许在表的一端进行插入和删除操作。思想:后进先出(先进后出)
二进制转换成十进制 or 十进制转换成二进制
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define StackSize 20
#define StackCount 10
typedef char DataType;
typedef struct {
DataType *base;
DataType *top;
int stackSize;
}StackList;
//栈的初始化
void InitStack(StackList *s){
s->base=(DataType *)malloc(StackSize *sizeof(DataType));
if(!s->base){
exit(0);
}
s->top=s->base;
s->stackSize =StackSize;
}
//栈存储数据
void push(StackList *s,DataType e){
//判断存储数据是否长度够存储
if(s->top-s->base>=s->stackSize){
//自动增加栈的长度 每次增加StackCount=10
s->base=(DataType *)realloc(s->base,(s->stackSize+StackCount)*sizeof(DataType));
if(!s->base)
exit(0);
}
//新增数据
*(s->top)=e;
//头指针增加1
s->top++;
}
//栈的取值
void pop(StackList *s,DataType *e){
//判断栈中是否依旧存在值
if(s->top==s->base){
return;
}
//取出栈中的值 并将top进行减一
*e=*--(s->top);
}
//取出栈的长度
int StackLen(StackList s) {
return (s.top-s.base);
}
//释放
void ClearStack(StackList *s)
{
s->base=s->top=NULL;
}
int main(){
DataType c;
StackList s;
int n;
int len,i,num,sum=0;
//初始化
InitStack(&s);
printf("开始您的操作\n");
printf("十进制转化成二进制\n");
printf("\n");
printf("请输入十进制数:\n");
scanf("%d",&n);
while(n)
{
push(&s,n%2);//调用入栈函数,具体的函数自己写
n=n/2;
c=n;
}
getchar();//改变键盘输入缓存指针,即将回车键读出来,这样可以避免“\r”字符(回车键)输出
len= StackLen(s);
printf("当前栈中二进制数的容量是:%d\n",len);
printf("转换的二进制数是:");
for(i=0;i<len;i++)
{
pop(&s, &c);
printf("%d",c);
}
printf("\n");
printf("\n");
printf("\n");
printf("开始您的操作\n");
printf("二进制转化成十进制\n");
printf("请输入二进制数,输入#负号表示结束!\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);
return 0;
}
运行截图: