使用栈能解决的问题
- 将二进制数据转换成十进制数据
1. 将二进制转换成十进制
在计算机内部数据存储都是保存成二进制的形式
而且二进制转换为十进制的公式为 sum(z^n-1) . n表示从二进制后面的位置开始计算.
利用之前定义的过的栈的基本操作实现。
stack_ex1.cpp
添加两个新的头文件string 用来存放输入的字符串
cmath 用来计算幂指数pow
/*
* 目的: 使用栈的数据结构实现将二进制数据转换成十进制
*
* 思路,将二进制数据塞到栈的结构中,通过访问栈的大小,进行循环遍历对每个出栈的数据2^i数值,同时求和即可
*
* name:ermore
* email: mzhmzh0109@163.com
*
*/
#include<iostream>
#include<stdexcept>
#include<string>
#include<cmath>
typedef int ElemType; // 取别名 (方便给栈选择不同的数据类型)
const unsigned int StackInitSize = 100; // 初始化每个栈刚开始的容量
const unsigned int StackSizeCre = 20; // 当栈的容量不能满足使用 需要对栈进行扩容处理
// 定义栈对象
struct Stack
{
ElemType *base; // 栈底
ElemType *top; // 栈顶
unsigned int StackSize; // 栈可以容纳最大的数据量
};
// 栈的初始化
void init_stack(Stack *sta){
// 给该栈分配内存(最大容量内存)
try{
sta->base = new ElemType[StackInitSize];
// 必须要保证分配内存成功!(当使用new 分配内存不成功,会抛出异常,所以需要捕捉这个异常!)
// 当使用new 分配内存不成功时,会抛出 bad_alloc 的异常
}catch(const std::bad_alloc& e)
{
std::cout<<"can,t init stack!";
return ;
}
// 分配内存正常后
sta->top = sta->base; // 此时空栈 栈顶和栈底对应的位置相同
sta->StackSize = StackInitSize;
}
// 插入新的元素 在栈顶
void push( Stack &sta , ElemType e){
auto size = sta.top - sta.base;
// 先判断该栈是否已经满
if(size == sta.StackSize){
ElemType *newdata = new ElemType[sta.StackSize+StackSizeCre]; // 此处也需要判断是否分配正常 但是一般情况都分配内存成功,故不做异常检查
auto temp = newdata;
// 将原来的数据全部拷贝的当前数据中
for(auto i = sta.base; i!= sta.top; ++i){
*(temp++) = *i;
}
*(temp++) = e;
delete[] sta.base;
sta.base = newdata;
sta.top = temp;
sta.StackSize = sta.StackSize+StackSizeCre;
}
else{
*(sta.top++) = e;
}
}
// 删除栈元素(只能删除栈顶的元素)
ElemType* pop(Stack &sta){
// 先判断是否为空栈
if(sta.base != sta.top){
return &*(--sta.top);
}else{
std::cout<<"this stack is empty!\n";
return nullptr;
}
}
// 返回栈的大小
unsigned int GetSize(Stack &sta){
return sta.top-sta.base;
}
// 获取栈顶元素的值
ElemType GetTopVal(Stack &sta){
auto temp = sta.top;
return *(--temp);
}
// 清空栈
void clean(Stack &sta){
sta.StackSize = 0;
delete[] sta.base;
}
// 主函数部分
int main(){
Stack stack ;
// 初始化栈的数据结构
init_stack(&stack);
std::string str;
std::cout<<"pleace input the binary num \n";
if(std::cin >> str){
// 将输入的字符串放入栈中
for(auto i : str){
if(i=='0' || i == '1'){ // 保证输入是二进制的形式
push(stack,i-48);
}else{
std::cout<<"input not binary num\n";
}
}
int i = 0;
int sum = 0;
while(GetSize(stack)){
sum+=*pop(stack)*pow(2,i++);
}
std::cout<<"result: "<<sum<<std::endl;
}else{
std::cout<<"input fail\n";
return -1;
}
return 0;
}
计算结果:
pleace input the binary num
11010110
result: 214
将二进制转换成八进制或者十六进制
思路相同:
对于八进制即每三位二进制数值代表一个八进制数值。
对于十六进制即每四位二进制数据代表一个十六进制数值。
同理将二进制放入字符串str中,仅对数据出栈进行修改。
stack_ex1_1.cpp
// 二进制出栈
int i = 0;
int sum = 0;
Stack result;
init_stack(&result);
while(GetSize(stack)){
if(i == 3) // 八进制的情况
{
push(result,sum);
i=0;
sum = 0;
}else{
sum+=*pop(stack)*pow(2,i);
i++;
}
}
if(i!=0) push(result,sum);
std::cout<<"result ";
while(GetSize(result)){
std::cout<<*pop(result);
}
std::cout<<std::endl;
计算结果:
pleace input the binary num
11001001
result 311
网友评论