数据结构 (c语言)
用栈实现二进制转换为十进制
本人是初学者,大概了解了下c语言,这是我第一次写博客哈哈,不知道该怎么写,就把我想的都写上去吧,嘻嘻。
头文件
#include <stdio.h
#define INITSIZE 100
#include <stdlib.h>
#include<math.h
栈结构的声明
typedef char ElempType;//在这里我定义了一个 char 类型,名字为ElemType
typedef stuct
{
ElempType *top;//栈顶指针
ElempType *base;//栈底指针,用于存放空间初始地址
int stacksize;//栈空间的长度
}sqstack;//该结构名字为 sqstack
栈的初始化
void Ininstack(sqstack *s)
{
s->base = (ElempType*)malloc(INTISIZE * sizeof(ElempType))//在这里(ElempType*)是定义指向这种类型的指针 malloc 是分配空间的函数
if(!s->base)//在这里进行判断是否生成!S-> base 相当于 s->base == 0
{
printf("栈分配错误");
exit(0);
}
s->top=s->base;//使头部指针指向底部
ts->stacksize = INITSIZE;//长度为ininsize
}
入栈
void Push(sqstack *s,ElempType e)//注意 定义的ElemType e,没用是指针
{
if(s->top - s->base >= s->stacksize)//在这里我用顶减底来确定大小,并且来判断是否超出了栈的空间大小
{
s->base = (ElempType*) realloc((s->stacksize+1)*sizeof(ElempType)) //当发现容量不够时,用realloc来扩容
if(!s->base)
{
printf("栈分配错误");
exit(0);
}
}
*(s->top) = e ;
s->top++;//可以变成一句话*(s->top++) = e;
}
在这里可以考虑下为啥这里的“e”没用指针
出栈
void Pop(sqstack *s,Elemptype *e)//注意着了是*e
{
if(s->top == s->base)//判断是否下溢
{
printf("此栈已空");
return;//返回类型为void;
}
*e = *(--(s->top))//top先减1再赋值到e(与上面的++作类比)。这部的目的是,把top的值 由*e带出去;
}
*在这我存在问题,在老师的ppt上,e = (–(s->top))写的为 x = s->base[–s->top];没看懂是啥意思
存储元素后栈的长度
int Stacklen(sqstack s)
{
return(s.top - s.base);
}
我比较喜欢指针的时候用 -> 非指针的时候用 "."
main函数
int main()
{
ElempType c
sqstack s;//初始化栈的结构
int len, sum=0;
Ininstack(&s);//初始化栈
printf("请输入一串二进制数,以回车键结束\n");
scanf_s("%c",&c);
while(c!='\n')//把元素一个一个放入
{
Push(&s,c);
scanf("%c",&c);
}
len = Stacklen(s);
printf("该栈的大小为:%d\n", len);
for(int i=0;i<len;i++)//这部是把二进制转换成十进制
{
Pop(&s,&c);//注意这里的“&c”上面Push是“c”
sum += (c-'0')*pow(2,i);
}
printf("二进制转换为十进制后为:%d\n", sum);
}
总结
1,什么时候用指针(*e)什么时候用(e)如果你写的这个结构体只是单纯的想读取其中的数据那么久可以直接用e 若想改变,传递里面的值就要用指针,如void Push(sqstack *s,ElempType e)
和void Pop(sqstack *s,Elemptype *e)
入栈时候只读取了它的值,而出栈的时候因为要在main函数里面引用,所以Pop中用了 *e
2,如果利用了指针是否可以不再使用return
?因为自己定义的大部分是void 类型,返回值为空,除了在“得到长度用了”int Stacklen(sqstack s)
返回值为整数型,若不用int 那有怎么写?
3,本代码并没有解决别人在乱输值的时候出现的问题,如输入“dsadasdas”,“243234536”这样的数据时,该代码不会告诉用户,你输入的非法的。
4,在main 函数里 的while循环里再次出现了scanf,我经过测试发现,如果我不输入这句话,那么在“入栈“”的时候 形参e 永远是开头的第一个数(如输入的是1010,它就一直输入1,无限循环,不会进入0),并且只有用char型 ,scanf 才有用,才会自动读取下个字符。
(--------------------------------------------------------------------------------------------------------------2020.03.13)