栈
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415161226604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDMzMzU5Nw==,size_16,color_FFFFFF,t_70#pic_center)
应用介绍
- 先利用栈将二进制数从左至右存储
- 再利用出栈将二进制数从右至作依次弹出
- 返回计算得到的十进制数
代码
#include <iostream>
using namespace std;
typedef int ElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 50
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)
{
exit(0);
}
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 + STACKINCREMENT) * sizeof(ElemType));
if (!s->base )
{
exit(0);
}
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
void popStack(Stack* s,ElemType *e)
{
if (s->top == s->base)
{
return;
}
*e = *--(s->top);
}
void destoryStack(Stack* s)
{
int i;
for (i = 0; i < s->stackSize; i++)
{
free(s -> base);
s->base++;
}
s->base = s->top = nullptr;
s->stackSize = 0;
}
int change(Stack s)
{
int i = 0;
int sum = 0;
ElemType elem;
while (s.top != s.base)
{
popStack(&s, &elem);
sum += elem * pow(2, i);
i++;
}
return sum;
}
int main()
{
Stack s;
ElemType num;
while(true)
{
initStack(&s);
cout << "二进制数输入,请输入0或1(非0非1 则结束输入):";
while (true)
{
cout << "num = ";
cin >> num;
if (num == 1 || num == 0)
{
pushStack(&s, num);
}
else
{
break;
}
}
int sum = change(s);
cout << "十进制数为:" << sum << endl;
system("pause");
system("cls");
}
return 0;
}
结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210415161543625.png#pic_center)
参考
小甲鱼