/*
c++描述将2进制数转化成10进制数
问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存,
还是在哪里可以加上delete
2.如果栈满了,我要分配多点空间,我想的办法是先用delete删除之前申请的
空间,再用new重新申请,但是c语言有一个函数
s->base =(ElemType*) realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType));//分配空间
不知道c++有没有這样的函数。
*/
#include <iostream>
#include <math.h>
using namespace std; const int STACK_INIT_SIZE=;
const int STACKINCREMENT=; typedef char ElemType; //定义一个字符串,因为二进制只有0和1,0的ascii表为48 ,1为49,
//只要进栈元素减去48再乘以2的次方数就ok typedef struct
{
ElemType* top; //栈顶
ElemType* base ; // 栈底
int stackSize; // 栈的容量
}sqStack; void InitStack (sqStack *s) //初始化栈
{
try
{
s -> base = new ElemType [STACK_INIT_SIZE] ; //申请空间
s -> top = s -> base ; //栈空 ,栈顶等于栈底
s -> stackSize = STACK_INIT_SIZE;
} catch (bad_alloc)
{
cout << "分配空间失败!"<< endl;
exit ();
}
} void Push (sqStack *s ,ElemType e) // 进栈
{
try{
if (s -> top - s -> base >= s->stackSize)
{
delete s -> base; // 删除先前分配的空间再重新分配
s -> base = new ElemType[STACK_INIT_SIZE+STACKINCREMENT];
}
*(s->top) = e; //先赋值再将栈顶往上移动
s->top++;
}
catch (bad_alloc){
cout << "分配空间失败!"<< endl;
exit ();
}
} void Pop(sqStack *s, ElemType *e)
{
if (s -> top == s -> base)
{
cout << "栈为空"<<endl;
exit();
} s -> top --; //先将栈顶指向元素,再把元素赋值给形参
*e= * s->top; // *e = *--(s->top); } int StackLen (sqStack s) //返回栈有多少个元素
{
return ( s.top - s.base); // 实质是地址相减 除以ElemType
} int main()
{
ElemType c; //声明一个字符c
sqStack s; //声明一个结构体s int len,i,sum=;
InitStack(&s); //初始化栈
cout <<"请输入二进制数,输入#结束"<<endl;
cin >>c;
while( c != '#')
{
Push (&s,c);
cin>>c;
}
getchar(); //接收回车键
len =StackLen(s);
cout <<"栈的当容量"<<len<<endl;
for(i=; i<len ; i++)
{
Pop(&s,&c);
sum = sum + (c-) * pow(,i);
}
cout <<"转化为十进制数为:"<<sum<<endl; return ;
}
05-08 14:50