测试空间旗下大头针出品
今天是端午节,也是C语言辅导的最后一课.讲了有关排序和栈的内容,特别是栈,企业有是很多时候都会问到这块知识.
C语言这块内容,企业很容易考进制转换.为什么呢?记得以前学习汇编语言的时候最经常做的事情就是进制的转换,把10进制与2进制,10进制与16进制,10进制与8进制的转换.了解计算机的人都知道电脑中硬件只能处理2进制数据,而我们一般输入的数据都是10进制,硬件是没有办法处理的.这样只能通过把10进制转换成2进制的方式来解决这个问题.
转换的方式有好多种,今天介绍一下用栈的方式来实现.刚好上次BLOG说过有关栈的问题.
首先由结构体来定义一个顺序栈.(顺序栈用途是广泛的)
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT 10 /*存储空间初始分配量*/
#define STACK_ADD 2 /*存储空间分配增量*/
typedef struct SqStack
{
int *base; /* 在栈构造之前和销毁之后,base的值为NULL.base=NULL是为了防止野
指针*/
int *top; /* 栈顶指针 */
int stacksize; /* 当前空间可以存储元素的个数 */
}Stack;
/*初始化栈是可是使用栈的第一步哦*/
int InitStack(Stack *S)
{
(*S).base=(int *)malloc(STACK_INIT*sizeof(int));/*这个地方没有用2级指针哦,为什么呢因为栈的指针变量S指向栈S,malloc()分配地址给指针变量base,而base就是栈里面的一个指针变量.所以就不用2级指针了.*/
if(!(*S).base)
exit(0);//直接退出
(*S).top=(*S).base;//栈的首地址有喽,就是指向已分配空间的首地址
(*S).stacksize=STACK_INIT;空间中元素的个数
return 1;
}
几个基本操作:
/*压栈*/
int Push(Stack *S,int e)
{
if((*S).top-(*S).base>=(*S).stacksize/*栈满,追加存储空间*/
{
(*S).base=(int *)realloc((*S).base,((*S).stacksize+STACKADD)*sizeof(int));
if(!(*S).base) //分配不成功则退出.
exit(0);
(*S).top=(*S).base+(*S).stacksize;//分配成功top的值应该重新指向了
(*S).stacksize+=STACKADD; //长度也应该增加
}
*((*S).top)++=e;
return 1;
}
int Pop(Stack *S,int *e)
{
if((*S).top==(*S).base)//栈空则返回0.
return 0;
*e=*(--)(*S).top;
return 1;
}
//什么是空栈呢?
int StackEmpty(Stack S)
{
if(S.top==S.base) //base是栈底.如果栈顶等于栈底那栈可就是空栈喽!
return 1;
else
return 0;
}
//有了前面一些关于栈的基本操作,那么下面我们来实现进制转换.
void change()
{
Stack S;
unsigned n;
int e;
InitStack(&S);
scanf("%u",&n);
while(n)
{
push(&S,n%2);
n=n/2;
}
while(!StackEmpty(S))
{
Pop(&S,&e);
if(e<=9)
printf("%d",e);
else
printf("%c",e+55);
}
printf("/n");
}
void main()
{
change();
}
好了,感觉如果读懂了这道题目,一些有关栈的基本的笔试问题,应该没有多大问题.
以后会陆续收集相关的笔试题目.
关于链表和2级指针:
C程序单链表面试题详解