马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
|