c++描述将一个2进制数转化成10进制数(用到初始化栈,进栈,入栈)

  1 /*
  2    c++描述将2进制数转化成10进制数
  3    问题,1.初始化栈后,用new,不知道delete是否要再写一个函数释放内存,
  4            还是在哪里可以加上delete
  5          2.如果栈满了,我要分配多点空间,我想的办法是先用delete删除之前申请的
  6            空间,再用new重新申请,但是c语言有一个函数
  7            s->base =(ElemType*) realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType));//分配空间
  8            不知道c++有没有這样的函数。
  9 */
 10 #include <iostream>
 11 #include <math.h>
 12 using namespace std;
 13 
 14 
 15 const int STACK_INIT_SIZE=20;
 16 const int STACKINCREMENT=10;
 17 
 18 typedef char ElemType;  //定义一个字符串,因为二进制只有0和1,0的ascii表为48 ,1为49,
 19                         //只要进栈元素减去48再乘以2的次方数就ok
 20 
 21 
 22 typedef struct 
 23 {
 24      ElemType* top;   //栈顶
 25      ElemType* base ;  // 栈底
 26      int  stackSize;   // 栈的容量
 27 }sqStack;
 28 
 29 
 30 void InitStack (sqStack *s)  //初始化栈
 31 {   
 32     try
 33     {
 34           s -> base = new ElemType  [STACK_INIT_SIZE] ; //申请空间
 35              s -> top = s -> base ;                     //栈空 ,栈顶等于栈底
 36           s -> stackSize = STACK_INIT_SIZE;      
 37     }
 38 
 39        catch (bad_alloc)
 40        {
 41           cout << "分配空间失败!"<< endl;
 42           exit (0);
 43        }
 44 }
 45 
 46 
 47 void Push (sqStack *s ,ElemType e)   // 进栈
 48 {
 49     try{
 50         if (s -> top - s -> base >= s->stackSize)
 51             {  
 52                  delete s -> base;     // 删除先前分配的空间再重新分配
 53                  s -> base = new ElemType[STACK_INIT_SIZE+STACKINCREMENT];
 54             }
 55            *(s->top) = e;   //先赋值再将栈顶往上移动
 56            s->top++;
 57         }   
 58     catch (bad_alloc){
 59             cout << "分配空间失败!"<< endl;
 60             exit (0);
 61     }
 62 }
 63 
 64 void Pop(sqStack *s, ElemType *e)
 65 {
 66        if (s -> top == s -> base)
 67        {
 68            cout << "栈为空"<<endl;
 69            exit(0);
 70        }
 71     
 72            s -> top --;     //先将栈顶指向元素,再把元素赋值给形参
 73            *e= * s->top;  //    *e = *--(s->top);    
 74       
 75 }
 76 
 77 int StackLen (sqStack s)    //返回栈有多少个元素
 78 {
 79    return ( s.top - s.base);  //  实质是地址相减 除以ElemType 
 80 } 
 81 
 82 
 83 
 84 int main()
 85 {
 86     ElemType c;  //声明一个字符c
 87     sqStack s;   //声明一个结构体s
 88 
 89     int len,i,sum=0;  
 90     InitStack(&s);     //初始化栈
 91     cout <<"请输入二进制数,输入#结束"<<endl;
 92     cin >>c;
 93     while( c != '#')
 94     {
 95        Push (&s,c);
 96        cin>>c;
 97     }
 98      getchar();   //接收回车键
 99      len =StackLen(s);
100      cout <<"栈的当容量"<<len<<endl;
101      for(i=0; i<len ; i++)
102      {
103          Pop(&s,&c);
104          sum = sum + (c-48) * pow(2,i);  
105      }
106      cout <<"转化为十进制数为:"<<sum<<endl;
107       
108 
109      return 0;
110 }

 

posted @ 2016-04-18 00:16  MrPat  阅读(785)  评论(0编辑  收藏  举报