#include
#include
#define STACK_INIT_SIZE 100 //存儲空間初始分配量
#define STACKINCREMENT 10//存儲空間分配增量
typedef struct
{
int base;//在棧構造和銷毀之後,base的值為NULL
int *top;//棧頂指針
int stacksize;//當前棧已分配的存儲空間,以元素為單位
}Sqstack;
void InitStack(Sqstack &S)//構造一個空棧
{
S.base = (int *)alloca(STACK_INIT_SIZE*sizeof(int));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE; //存儲空間初始分配量100
}
bool Push(Sqstack &S, int e)
{
//插入元素e作為棧頂元素
if (S.top - S.base >= S.stacksize)//棧滿追加存儲空間
{
S.base = (int *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(int));
if (!S.base) { exit(OVERFLOW); return false; }//分配失敗
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++= e;
return true;
}//push
bool Pop(Sqstack &S, int &e)
{
//若棧不空則刪除棧頂元素,用e返回值,返回true,否則返回false
if (S.top == S.base) return false;//空棧
e = *--S.top;
return true;
}//pop
bool IsEmpty(Sqstack S)
{
//判斷棧是否為空
if (S.top == S.base)return true;
return false;
}
void Conversion(int x)
{
//轉換10進制數
Sqstack S;
int temp;
InitStack(S);//構造空棧
if (x == 0)printf("0");
else
{
while (x)
{
Push(S, x % 2);
x /= 2;
}//將10進制數短除,入棧
while (!IsEmpty(S))
{
Pop(S, temp);
printf("%d", temp);
}//逆序輸出
}
putchar(10);
}//Conversion
int main()
{
printf("*************非遞歸算法**************\n");
for (int i = 0; i < 16; i++)
Conversion(i);
system("pause");
return 0;
}
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100 //存儲空間初始分配量
#define STACKINCREMENT 10//存儲空間分配增量
#define OVERFLOW 1
typedef struct
{
int *base;//在棧構造和銷毀之後,base的值為NULL
int *top;//棧頂指針
int stacksize;//當前棧已分配的存儲空間,以元素為單位
}Sqstack;
void InitStack(Sqstack &S)//構造一個空棧
{
S.base = (int *)alloca(STACK_INIT_SIZE*sizeof(int));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE; //存儲空間初始分配量100
}
bool Push(Sqstack &S, int e)
{
//插入元素e作為棧頂元素
if (S.top - S.base >= S.stacksize)//棧滿追加存儲空間
{
S.base = (int *)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(int));
if (!S.base) { exit(OVERFLOW); return false; }//分配失敗
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++= e;
return true;
}//push
bool Pop(Sqstack &S, int &e)
{
//若棧不空則刪除棧頂元素,用e返回值,返回true,否則返回false
if (S.top == S.base) return false;//空棧
e = *--S.top;
return true;
}//pop
bool IsEmpty(Sqstack S)
{
//判斷棧是否為空
if (S.top == S.base)return true;
return false;
}
void Conversion(int x)
{
//轉換10進制數
Sqstack S;
int temp;
InitStack(S);//構造空棧
if (x == 0)printf("0");
else
{
while (x)
{
Push(S, x % 2);
x /= 2;
}//將10進制數短除,入棧
while (!IsEmpty(S))
{
Pop(S, temp);
printf("%d", temp);
}//逆序輸出
}
putchar(10);
}//Conversion
int main()
{
printf("**************非遞歸算法**************\n");
for (int i = 0; i < 16; i++)
Conversion(i);
system("pause");
return 0;
}
**************非遞歸算法**************
0
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
Press any key to continue . . .