栈在软件开发中应用非常广泛(函数调用、进制转换、括号匹配问题),记得刚刚毕业那会找工作,面试一家公司,上机题就是写一个二进制转换十进制的方法,两个小时硬是没有写出来(当时太傻,不知道查询下javaapi实现),更幼稚时自己当时和那个公司hr讲“在实际开发中,不会用这些知识,我有很好的代码编写能力,能不能让我和你们项目经理谈谈”,结果可想而知。从这次面试中也懂得一点常识,如果想让别人帮助你,请先展现自己的实力和靠谱的梦想,因某些客观的原因没有很好展示,请不要开口寻求帮助(让别人为难,也让自己难堪)。

一、逻辑分析

  题目:利用栈的数据结构特点,将二进制转换为十进制数

  分析:搞编程的MMJJ都知道,二进制数是计算机数据的存储形式,它是由一串01组成的,每个二进制数转换成相应的十进制数方法如下:

  公式:(XnXn-1……X3X2X1)2 = X1*2^0+X2*2^1++Xn*2^(n-1)

 

  举例:0101 = 0X2^3+1X2^2+0X2^1+1X2^0

 

  从上面一串复杂的公式可以看出来,数学是编程的基础,有些伪大师到处宣传英语和数学学习不好的人,也可以学好编程(能写代码和写好代码有着天壤之别),这个基本是忽悠人。当然也可以当做善意的谎言,千万别当真。

二、代码分析

1、二进制转换十进制代码:

如图分析:

启迪思维:栈应用

代码分析: 

 1 /**
 2  *根据输入的值初始化栈
 3  */
 4 void Convert::InitStack(LinkStack<char> *stack){
 5 
 6     //接受用户输入值,学习编程都知道二进制是0和1数字,
 7     //为什么不用int,请参考test和test1运行结果区别
 8     char c;
 9     std::cout<<"input binary:"<<std::endl;
10     std::cin >> c;
11 
12     //判断是否是二进制数
13     while(c == '0' || c == '1'){
14         //压入栈中
15         stack->Push(c);
16         //循环接受用户输入
17         std::cin >> c;
18     }
19 }
20 
21 /**
22  *二进制转化十进制函数
23  */
24 void Convert::BinToDec(){
25 
26     //初始化栈
27     LinkStack<char> stack;
28     InitStack(&stack);
29 
30     //sum存放转化后的十进制,i记录每次2的几次方,初始值为0
31     //例如:1011二进制最后一位就是1X2^0
32     int sum = 0,i = 0;
33     //接受出栈元素的值
34     char e;
35 
36     //判断栈是否为空
37     while(!stack.IsEmpty()){
38         //元素出栈
39         stack.Pop(e);
40         //e是是char类型,需要通过ASCII值转化成int(0对应ASCII:48,1对应ASCII:49)
41         sum = sum + (e - 48) * pow(2,i);
42         //每次出栈一个元素,自动加1次方
43         ++i;
44     }
45     //输出转化后的十进制数
46     std::cout<<sum<<std::endl;
47 }

 完整代码

Common.h

/*
 * Common.h
 *
 *  Created on: May 17, 2012
 *      Author: sunysen
 */

#ifndef COMMON_H_
#define COMMON_H_

#include <iostream>
#include "memory"
#include "string"
#include <math.h>
#include "core/node/LNode.h"



using namespace std;
#endif /* COMMON_H_ */
View Code

相关文章: