zoukankan      html  css  js  c++  java
  • 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 }
    博客园的文章都是大学时写的,质量不太好。 我的新文章都会发布再新的 blog :https://blog.biyongyao.com 请大家关注哟!!
  • 相关阅读:
    九九乘法表
    判断and ,or
    格式化输出
    标志位
    循环
    ECMA-262规范定义的七种错误类型
    主流浏览器内核
    代理服务器(理解篇)
    前端常用词汇整理
    LeetCode 451. 根据字符出现频率排序
  • 原文地址:https://www.cnblogs.com/biyongyao/p/5402924.html
Copyright © 2011-2022 走看看