|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 weico 于 2017-4-27 19:48 编辑
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define STACK_INIT_SIZE 20
- #define STACK_INCREMENT 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->base = s->top;
- 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*STACK_INCREMENT) * sizeof(ElemType));
- if( !s->base )
- {
- exit(0);
- }
- }
- *(s->top) = e;
- s->top++;
- }
- void Pop (sqStack *s,ElemType *e)
- {
- if( s->base == s->top)
- {
- return;
- }
- *e = *--(s->top);
- }
- int StackLen(sqStack s)
- {
- return (s.top - s.base);
- }
- int main()
- {
- ElemType c;
- sqStack s1;
- sqStack s2;
- int len,i,j,sum = 0;
- InitStack(&s1);
- printf("请输入一个二进制数,以#结束!\n");
- scanf("%c",&c);
- while(c != '#')
- {
- Push(&s1,c);
- scanf("%c",&c);
- }
- InitStack(&s2);
- getchar();//把回车字符从键盘缓冲区去掉
- len = StackLen(s1);
- printf("二进制数栈的当前容量为:%d\n",len);
- for(i = 0;i < len;i += 3)
- {
- for(j =0;j<3;j++)
- {
- Pop(&s1,&c);
- sum += (c-48) * pow(2,j);
- if(s1.base == s1.top)
- {
- break;
- }
- }
- Push(&s2,sum + 48);
- sum = 0;
- }
- printf("转换的八进制数是");
- while(s2.base != s2.top)
- {
- Pop(&s2,&c);
- printf("%c",c);
- }
- printf("\n");
- return 0;
- }
复制代码 在学习利用栈进行进制转换的时候,按照甲鱼各的方法写的二进制转换为十进制没问题,自己动手写的时候停止服务了,利用调试功能 报这个错误Program received signal SIGSEGV, Segmentation fault. 调试时到push函数,就是压栈的时候出问题,网上的答案说是对空指针进行了操作,可是我没改过压栈的代码啊,压栈代码和甲鱼哥的二进制转十进制是一样的,为什么报这个错误呢,弄了好久了,麻烦大家帮忙解决一下!!
终于弄清楚了,是因为初始化栈的时候写的是底指针base等于头指针top,逻辑错误,罪过呀,正确的写法是 s->top = s->base;
|
-
|