进制转换如何用栈实现:栈与进制转换器
进制转换如何用栈实现:栈与进制转换器#include "math.h"#include "stdio.h"运算过程图示如下:上面需要转换的数据1011101将高位先放入s1栈底,后面放入的是低位,转换后将低位放入s2栈底,高位放到栈底。取出输出时在s2栈顶先取出高位,刚好就是我们习惯排列的135。附源码:
我们平常所说的线性表是指操作的位置或元素的内容没有限制的一种数据结构。在特定的情况下,对操作或元素有所限制是很有必要的,如下图:
具体到对现实世界的映射,不同的容器有不同的用途。普通顺序表就像一个敞开的货架,你可以放任何东西,也可以在头、尾、中间放入和拿取。队列就像排队,新加入的只能在后面排,最前面的可以先出队,不能插队。栈就如同只有一个口的容器,拿取时只能取出后面放入的。
栈(stack)是一种后进先出(LIFO)的线性表,栈规定只能在线性表的一端进行插入和删除元素的操作。栈一般使用顺序存储的方式存储,当然也可以是链表存储。
运行效果:
运算过程图示如下:
上面需要转换的数据1011101将高位先放入s1栈底,后面放入的是低位,转换后将低位放入s2栈底,高位放到栈底。取出输出时在s2栈顶先取出高位,刚好就是我们习惯排列的135。
附源码:
#include "stdio.h"
#include "math.h"
#include "malloc.h"
#define STACK_INIT_SIZE 30
#define STACKINCREMENT 10
typedef struct{
char *base;
char *top;
int stacksize;
}sqStack;
int initStack(sqStack *s)
{
/*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
if(!s->base) return 0;/*分配空间失败*/
s->top = s->base;/*最开始,栈顶就是栈底*/
s->stacksize = STACK_INIT_SIZE;/*最大容量为STACK_INIT_SIZE */
return 1;
}
int Push(sqStack *s char e){
if(s->top - s->base >= s->stacksize){/*栈满,追加空间*/
s->base = (char *)realloc(s->base (s->stacksize
STACKINCREMENT)*sizeof(char));
if(!s->base) return 0;/*存储分配失败*/
s->top = s->base s->stacksize;
s->stacksize = s->stacksize STACKINCREMENT;/*设置栈的最大容量*/
}
*(s->top) = e;/*放入数据*/
s->top ;
return 1;
}
int Pop(sqStack *s char *e){
if(s->top == s->base) return 0;
*e = *--(s->top);
return 1;
}
void Bi2Oct()
{
sqStack s1;
sqStack s2;
char c;
int i sum=0;
initStack(&s1);/*创建一个栈s1,用来存放二进制字符串*/
scanf("%c" &c);/*输入0/1字符表示的二进制数,以#结束*/
while(c!='#')
{
if(c=='0' || c=='1')
Push(&s1 c);
scanf("%c" &c);
}
initStack(&s2);/*创建一个栈s2,用来存放八进制字符串*/
while(s1.top!=s1.base)
{
for(i=0;i<3 && s1.top!=s1.base;i )
{
Pop(&s1 &c);/*取出栈顶元素*/
sum = sum (c-48) * pow(2 i);/*转换为八进制数*/
//数字0-9在ASCII中是48-57号字符
}
Push(&s2 sum 48) ;/*将八进制数以字符形式压入栈中*/
sum = 0;
}
while(s2.base != s2.top ){/*输出八进制栈的内容*/
Pop(&s2 &c);
printf("%c" c);
}
}
main()
{
printf("Please input a binary number to convert to octal number,ended by '#'\n");
Bi2Oct();
getchar();
getchar();
}
-End-