引入
我们学习了栈的基本操作,今天我们就看看,栈能为我们做哪些服务,以及如何灵活的使用栈的这些特性。我们就从二进制数转换为十进制数的例子说起。
方法
首先,我们先说明一下二进制转十进制
的公式
公式 $n\times 2^{n-1}$
N 表示二进制的从右向左
的位数,然后把所有位的和相加,就是十进制结果。
演示
二进制数:$100101$
第 1 位:$1 \times 2^{1-1}=1 \times 1=1$
第 2 位:$0 \times 2^{2-1}=0 \times 2=0$
第 3 位:$1 \times 2^{3-1}=1 \times 4=4$
第 4 位:$0 \times 2^{4-1}=0 \times 8=0$
第 5 位:$0 \times 2^{5-1}=0 \times 16=0$
第 6 位:$1 \times 2^{6-1}=1 \times 32=32$
结果是:$1+0+4+0+0+32=37$
其实就是计算非零数相加。
代码实现
清楚了计算方法之后,我们就通过代码来看看如何实现这个功能
初始化栈
1 |
|
压栈、出栈、栈长
然后我们写三个函数,能够压栈、出栈、栈长1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20void push(struct Stack *s , char data){
if(s->top-s->base>=s->num){
s->base=(int *)realloc(s->base,(s->num+INCREMENT)*LEN);
s->top=s->base+s->num;
s->num=s->num+INCREMENT;
}
*(s->top)=data;
s->top++;
}
int pop(struct Stack *s){
if(s->top-s->base==0){
return 0;
}
return *--(s->top);
}
int length(struct Stack *s){
return s->top-s->base;
}
二进制转换
然后是二进制转换
- 根据栈长判断要转换多少位
- 从右向左转换,正好是栈后入先出的顺序
- 因为 push 压入的是 char 类型,所以要减去48,转换成数字
- 然后利用 pwo 函数,计算指数
1 | int translate(struct Stack *s){ |
main 函数主调
1 | int main(){ |
全部代码
1 |
|
输出结果
请输入二进制数:
10010#
栈的容量是:5
十进制数为:18
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。