【学习点滴-数据结构-栈&队列】 栈的应用之一:数值转换

/*数值转换问题描述:对于十进制数值,转换为其他的2进制或者8进制数值问题,可以用栈来解决。

 *具体原理:N= (N div d) * d + N mod d;

 **/


//算法conversion实现从十进制转换为二进制或者八进制并输出。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>

//栈的初始最大容量 
#define STACK_MAX_SIZE 100

//栈的容量增量 
#define INCREAMENT 10

//状态函数 
#define ERROR 0
#define OK 1
#define SOVERFLOW -1 
#define YES 1
#define NO 0 


typedef int Status,SElemType,ElemType;
typedef struct{
    SElemType *base;
    SElemType *top;
    int stackSize;//当前已经分配的空间,不是指栈中元素个数。          
}sqStack;

Status InitStack(sqStack &S){
     //初始化栈空间,栈为空  
     S.base = (SElemType *)malloc(STACK_MAX_SIZE * sizeof(ElemType));
     if(!S.base){
          exit(SOVERFLOW);                   
     }
     S.top = S.base;
     S.stackSize = STACK_MAX_SIZE;
     return OK;  
}


//如果栈不空,用e传出栈顶元素并返回OK。否则返回错误。 
Status GetTop(sqStack S,SElemType &e){
    if(S.top == S.base){
         return ERROR;
    } 
    e = *(S.top - 1);
    return OK;  
}

/*
 * Push(S,e)向栈S中压入元素e。需要考虑的情况有:
 * 1.栈已经满,需要增加空间。如果无法继续增加空间,则退出。
 * 2.栈未满。先压入元素,然后修改栈顶指针。 
 **/
Status Push(sqStack &S,SElemType e){
    if((S.top - S.base) >= S.stackSize){
         S.base = (ElemType*)realloc(S.base,(S.stackSize + INCREAMENT) * sizeof(ElemType));
         if(!S.base){
             exit(SOVERFLOW);                  
         }
         S.top = S.base + S.stackSize;
         S.stackSize += INCREAMENT;  
    }
    //先压入元素,然后修改指针。弹出时相反 
    *S.top = e;
    S.top ++; 
    return OK;      
}

/*
 *  弹出栈顶元素。需要注意的有:
 *  1.栈不空。则先修改指针,然后弹出元素并传送给e。 
 *  2.栈为空时,返回错误。 
 */ 
Status Pop(sqStack &S,ElemType &e){
    if(S.top == S.base){
        return ERROR;              
    }
    //先修改指针,然后弹出元素。 
    S.top --;
    e = *S.top; 
    return OK;   
}

Status isEmpty(sqStack S){
    if(S.top == S.base){
        return YES;         
    }
    return NO;   
} 


void conversion(int N,int base){   
     assert(base == 2 || base == 8); 
     sqStack S;
     InitStack(S);
     int t = N,res;
     while(t){
         Push(S,t%base);
         t = t/base;              
     } 
     while(!isEmpty(S)){
         Pop(S,res);
         printf("%d ",res);                   
     }
     printf("\n");    
} 

main(){
    int rands;
    for(int i = 0;i<100;i++){
        rands = rand()%1000;
        printf("int  :%d---> ",rands); 
        conversion(rands,8);  
    }
    system("pause");
    return 0;       
       
} 




你可能感兴趣的:(数据结构,算法,struct,System,div)