利用棧的資料結構特點,將二進位制轉換為十進位制數。
二進位制數是計算機資料的儲存形式,它是由一串0和1組成的,每個二進位制數轉換成相應的十進位制數方法如下:
(xnxn-1……x3x2x1)2 = x1*2^0+x2*2^1+…+xn*2^(n-1)
乙個二進位制數要轉換為相應的十進位制數,就是從最低位起用每一位去乘以對應位的積,也就是說用第n位去乘以2^(n-1),然後全部加起來。
由於棧具有後進先出的特性,
例如輸入11001001這樣的二進位制數,
如圖:
**實現:
#include #include #include #define stack_init_size 20
#define stackincrement 10
typedef char elemtype;
typedef struct
sqstack;
void initstack(sqstack *s)
s->top = s->base;
s->stacksize = stack_init_size;
}void push(sqstack *s, elemtype e)
}*(s->top) = e;
s->top++;
}void pop(sqstack *s, elemtype *e)
*e = *--(s->top);
}int stacklen(sqstack s)
int main()
getchar(); // 把'\n'(回車)從緩衝區去掉
len = stacklen(s);
printf("棧的當前容量是: %d\n", len);
for( i=0; i < len; i++ )
printf("轉化為十進位制數是: %d\n", sum);
return 0;
}
二進位制是計算機唯一認識的,十進位制是人們通常使用的。
觀察二進位制跟十六進製制的對應關係:
可見乙個位元組(8bit)剛好用兩個十六進製制數可以表示完整,也大大的節省了顯示空間。
八進位制:因為早期的計算機系統都是三的倍數,所以用八進位制比較方便。
在進行二進位製到八進位制的轉換時,要將二進位制數的每三位轉換成乙個八進位制數來表示,然後按順序輸出即可。
**實現:
/** 二進位制/八進位制轉換器 **/
#include #include #include #define stack_init_size 20
#define stackincrement 10
typedef char elemtype;
typedef struct
sqstack;
// 函式功能:初始化棧
void initstack(sqstack *s)
s->top = s->base;
s->stacksize = stack_init_size;
}// 函式功能:入棧操作
// 引數e:待壓入棧的元素
void push(sqstack *s, elemtype e)
s->top = s->base + s->stacksize;
s->stacksize = s->stacksize + stackincrement;
}*(s->top) = e;
s->top++;
}// 函式功能:彈棧操作
// 引數e:存放從棧裡彈出的資料
void pop(sqstack *s, elemtype *e)
*e = *--(s->top);
}// 函式功能:計算棧s的當前長度
// 引數s:棧
int stacklen(sqstack s)
int main()
getchar(); // 把'\n'從緩衝區去掉
len = stacklen(s1);
initstack(&s2); // 初始化棧s2,用來存放轉換的八進位制
for( i=0; i < len; i+=3 )
}push( &s2, sum+48 );
sum = 0;
}printf("\n轉化為八進位制數是: ");
while( s2.base != s2.top )
printf("(o)\n");
return 0;
}
**實現:
/** 二進位制/十六進製制轉換器 **/
#include #include #include #define stack_init_size 20
#define stackincrement 10
typedef char elemtype;
typedef struct
sqstack;
// 函式功能:初始化棧
void initstack(sqstack *s)
s->top = s->base;
s->stacksize = stack_init_size;
}// 函式功能:入棧操作
// 引數e:待壓入棧的元素
void push(sqstack *s, elemtype e)
s->top = s->base + s->stacksize;
s->stacksize = s->stacksize + stackincrement;
}*(s->top) = e;
s->top++;
}// 函式功能:彈棧操作
// 引數e:存放從棧裡彈出的資料
void pop(sqstack *s, elemtype *e)
*e = *--(s->top);
}// 函式功能:計算棧s的當前長度
// 引數s:棧
int stacklen(sqstack s)
int main()
getchar(); // 把'\n'從緩衝區去掉
len = stacklen(s1);
initstack(&s2); // 初始化棧s2,用來存放轉換的八進位制
for( i=0; i < len; i+=4 )
}switch( sum )
push( &s2, sum );
sum = 0;
}printf("\n轉化為十六進製制數是: ");
while( s2.base != s2.top )
printf("(h)\n");
return 0;
}
利用棧實現整型多進製轉換
include include includeusing namespace std void multioutput int num,int b while st.empty return 0 關於棧中為什麼pop元素沒有返回值,而是使用top來返回元素的值,這裡要做一下說明,如果pop返回棧頂部...
用棧實現進製轉換
在本例中,用棧實現二進位製到十進位制的轉換,其他進製轉換類似 本例使用的棧的結構如下 如下 include include using namespace std typedef struct node node,pnode 棧中每個元素都是節點,這裡定義節點 typedef struct stac...
順序棧實現進製轉換
1.定義乙個順序棧的結構體。typedef struct sqstack 2.寫乙個建立空順序棧的函式 status init stack sqstack s 3.寫乙個輸出順序棧元素的函式 status exit stack sqstack s printf n 4.這裡進製轉換的方法就是,先把k...