1. C/C++

DEC TO BIN 新方法 [栈实现]

最近学习数据结构,想起以前刷PAT的时候遇到的一个题目:进制转换。

当时做这道题时用数组实现的:1022 D进制的A+B(20 分) 

现在换种方法,用栈来实现。

为了练手,我们自己构造栈。

/************************
 *Stack application [DEC TO BIN]
 *SENCOM LAB
 *Michael Jiang
 *2018-9-18
 ************************/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
#include "stdio.h"
#include "stdlib.h"

typedef struct {
  int *base;
  int *top;
  int stacksize;
}SqStack;

//active funtion
int InitStack(SqStack &s)
{
  s.base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
  if(!s.base) return ERROR;
  s.top = s.base;
  s.stacksize = STACK_INIT_SIZE;
  return OK;
}
int DestroyStack(SqStack &s)
{
  free(s.base);
  return OK;
}
int ClearStack(SqStack &s)
{
  s.top = s.base;
  return OK;
}
int GetTop(SqStack &s,int &e)
{
  if(s.top == s.base) return ERROR;
  e = *(s.top-1);
  return OK;
}
int Push(SqStack &s,int e)
{
  if(s.top - s.base >= s.stacksize) {
  /*
  realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。
  如果将分配的内存减少,realloc仅仅是改变索引的信息。
  如果是将分配的内存扩大,则有以下情况:
  1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
  2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
  3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
  注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。
  */
  s.base = (int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base)exit(-1);
  s.top = s.base + s.stacksize;
  s.stacksize += STACKINCREMENT;
  }
  *s.top = e;
  s.top++;
  return OK;
}
int Pop(SqStack &s,int &e)
{
  if(s.top == s.base) return ERROR;
  e = *(s.top-1);
  s.top--;
  //e = *(--s.top);
  return OK;
}

//Static funtion
int StackEmpty(SqStack s)
{
  if(s.top == s.base)
    return TRUE;
  else
    return FALSE;
}
int StackLength(SqStack s)
{
  int length;
  length = s.top - s.base;
  return length;
}
int StackTravel(SqStack s)
{
  int *p = s.top;
  printf("top->");
  for(p--;p >= s.base ; p--)
  {
    printf("%d->",*p);
  }
  printf("base\n");
  return OK;
}

//main funtion
int main(int argc, char const *argv[]) {
  /* code */

  SqStack s;
  if(!InitStack(s))exit(-1);
  int dec, mod;
  int bin;
  printf("INPUT DEC:");
  scanf("%d",&dec);
  while(dec){
  mod = dec % 2;
  dec = dec/2;
  Push(s,mod);
  }
  printf("BIN:");
  while(Pop(s,bin))
    printf("%d",bin);
  printf("\n");
  //StackTravel(s);
  return 0;
}

PS:栈是真的好用!!! 

END