最近学习数据结构,想起以前刷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