标签:cpp 停止 img span 变量 struct tst == exit
用栈的知识,编写一个程序,输入二进制,输出十进制
注意点:
1.在主函数里别忘了先创建一个栈,在进行入栈操作
2.转换过程会用到一个循环,需要用到栈的实际长度作为条件,要在进入循环前先把长度计算出来存入到变量len中,而不能用stack.top - stack.base来代替len,因为在循环中需要出栈操作,所以(stack.top - stack.base)是变化的
代码如下:
#include<stdio.h> #include<stdlib.h> #include<math.h> /****************************************************** * 做一个入栈操作,把一串二进制数字压入栈里 * 之后应该是一个出栈操作,包括在一个大循环中 * 第一个出栈的乘以2^0,第二个出栈的乘以2^1.....以此类推 * 把每个二次幂的结果求和就得到十进制 * **************************************************/ typedef struct { int *base; int *top; int stacksize; }sqStack; ////////////////////////////////////////////////////// //创建栈 #define STACK_INIT_SIZE 100 void initstack(sqStack *stack) { stack->base = (int*)malloc( STACK_INIT_SIZE * sizeof(int)); if (!stack->base) { exit(0); } stack->top = stack->base; stack->stacksize = STACK_INIT_SIZE; } ///////////////////////////////////////////////////////// //入栈操作 #define STACK_MORE 10 void Push(sqStack *stack , int c) { if (stack->top - stack->base > stack->stacksize) { stack->base = (int*)realloc(stack->base , (stack->stacksize + STACK_MORE) * sizeof(int)); if (!stack->base) { exit(0); } stack->top = stack->base + stack->stacksize; stack->stacksize = stack->stacksize + STACK_MORE; } *(stack->top)=c; stack->top++; } //////////////////////////////////////////////////////////// //出栈操作 void Pop(sqStack *stack , int *c) { if (stack->base == stack->top) { return; } *c = *--(stack->top); } int main() { sqStack stack; int c; initstack(&stack);//创建一个栈 printf("请输入需要转换的二进制:"); while ((c = getchar()) != ‘\n‘)//读取输入的二进制字符串,输入回车停止 { if (c!=‘\n‘)//防止回车符压进栈中 { Push(&stack , c); } } int sum = 0;//十进制结果 int len = stack.top - stack.base;//计算栈的实际长度 for (size_t i = 0; i < len; i++) { Pop(&stack, &c);//注意这边出栈操作后栈的长度会减小,所以前面用一个len,而不是直接用stack.top - stack.base sum = sum + (c-48)* pow(2,i);//这边我也不知道为什么变量c从int类型变成了char型,所以减去48 } printf("对应的十进制为:%d",sum); return 0; }
运行结果:
标签:cpp 停止 img span 变量 struct tst == exit
原文地址:https://www.cnblogs.com/jerryleesir/p/13336350.html