妙趣横生的算法实例1-4
来源:互联网 发布:连云港网络推广 编辑:程序博客网 时间:2024/04/29 20:53
#include <stdio.h>#include <malloc.h>#include <math.h>#define STACK_INIT_SIZE 10#define STACK_INCREMENT_SIZE 10typedef char ElemType;typedef struct {ElemType *base;ElemType *top;int stackSize;}stack;void initStack(stack *s){s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!(s->base)) return;s->top = s->base;s->stackSize = STACK_INIT_SIZE;}void pushStack(stack *s, ElemType e){if((s->top - s->base) >= s->stackSize){s->base = (ElemType *)realloc(s->base, (s->stackSize + STACK_INCREMENT_SIZE) * sizeof(ElemType));if(!(s->base)) return;s->top = s->base + s->stackSize;s->stackSize = s->stackSize + STACK_INCREMENT_SIZE;}*(s->top) = e;(s->top)++;}void popStack(stack *s, ElemType *e){if(s->base == s->top) return;*e = *(--(s->top));}int stackLen(stack s){return (s.top - s.base);}void destroyStack(stack *s){free(s->base);s->base = s->top = NULL;s->stackSize = 0;}//void destroyStack(stack *s)//{//int i, len;//len = s->stackSize;//for(i = 0; i < len; i++)//{//free(s->base);//s->base++;//}////s->base = s->top = NULL;//s->stackSize = 0;//}int power(int n){int i;int product = 1;for(i = 1; i <= n; i++){product = product * 2;}return product;}void main(){stack binaryToDecimalStack;int i, len, decimal = 0;ElemType pushBinary, popBinary;initStack(&binaryToDecimalStack);printf("请输入二进制数,以“;”结束:\n");scanf("%c", &pushBinary);while(pushBinary != ';'){pushStack(&binaryToDecimalStack, pushBinary);scanf("%c", &pushBinary);}len = stackLen(binaryToDecimalStack);for(i = 0; i < len; i++){popStack(&binaryToDecimalStack, &popBinary);while(popBinary != '0' && popBinary != '1'){printf("不好意思,您输入的不是二进制数据!:\n");return;}decimal = decimal + (popBinary - 48) * power(i);}for(i = 0; i < len; i++){printf("%c", *(binaryToDecimalStack.base++));}printf("转换成的二进制为:%d\n", decimal);//destroyStack(&binaryToDecimalStack);}
这个程序销毁栈的时候,在windows会崩溃,我也不知道怎么回事?有谁能告诉我吗?回头到linux下试试。
我刚开始把类型定义为int型,但是没有办法判断什么时候结束,而且,如果输入字符的话,就会出错,看书上定义为char型,感觉不错,而且char型占一个字节,而int要占4个字节。
我知道哪里错了,
for(i = 0; i < len; i++) { printf("%c", *(binaryToDecimalStack.base++)); //这句base++,base已经指向其它地方了,原因是你Pop的时候stack size没有-- }
把这里改为:
for(i = 0; i < len; i++) { printf("%c", binaryToDecimalStack.base[i]); }
就可以了。
- 妙趣横生的算法实例1-4
- 妙趣横生的算法实例1-1
- 妙趣横生的算法实例1-2
- 妙趣横生的算法实例1-3
- 妙趣横生的算法实例1-5
- 妙趣横生的算法实例1-6
- 妙趣横生的算法实例1-7
- 妙趣横生的算法实例1-7
- 妙趣横生的算法学习1
- 妙趣横生的算法2010-1-3
- 妙趣横生的算法-图
- 妙趣横生的算法实例2-2-->折半查找
- 妙趣横生的算法学习2
- 妙趣横生的算法(1)之顺序表操作
- 妙趣横生的算法之栈的操作
- 妙趣横生的算法之队列的操作
- 妙趣横生的算法(C语言实现)
- 妙趣横生的算法之2 链表
- IOS 多线程的一些总结
- 【材料】背包九讲
- Scaling Up And Out
- Core Animation学习笔记
- android多媒体本地播放流程video playback--base on jellybean (二)
- 妙趣横生的算法实例1-4
- Linux使用文件创建swap
- 了解SVG
- 利用hash表思想,实现查找到第一个在字符串中出现的字符
- 操作系统--1写这一系列的目的
- 菜鸟逆袭 Crackme第二弹 附带注册机
- Squid的main函数源码分析
- Yii: 如何在CGridView组件中根据不同的记录行数据显示不同的操作
- objc 的新特性