出栈函数: node Pop( LinkStack &S) { node temp; temp.data = 0; temp.next = NULL; if( NULL == S) //检验栈 { printf(“There no node in stack!”); return temp; } temp = *S;
10
if( S->next == NULL ) { printf(“The stack is NULL,can’t pop!\n”); return temp; } LinkStack p = S ->next; //节点出栈 S->next = S->next->next; temp = *p; free( p ); p = NULL; return temp; }
双栈实现队列的入队函数: LinkStack StackToQueuPush( LinkStack &S, int data) { node n; LinkStack S1 = NULL; CreateNULLStack( S1 ); //创建空栈 while( NULL != S->next ) //S出栈入S1 { n = Pop( S ); Push( S1, n.data ); } Push( S1, data ); //新结点入栈 while( NULL != S1->next ) //S1出栈入S { n = Pop( S1 ); Push( S, n.data ); } return S; }
说明:用两个栈能够实现一个队列的功能,那用两个队列能否实现一个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在一起,就是先进先出。而队列是现先进先出,无论多少个连在一起都是先进先出,而无法实现先进后出。
面试题23:计算一颗二叉树的深度
深度的计算函数: int depth(BiTree T) { if(!T) return 0; //判断当前结点是否为叶子结点
11
int d1= depth(T->lchild); //求当前结点的左孩子树的深度 int d2= depth(T->rchild); //求当前结点的右孩子树的深度 return (d1>d2 d1:d2)+1; }
注意:根据二叉树的结构特点,很多算法都可以用递归算法来实现。
直接插入排序编程实现如下: #include
注意:所有为简化边界条件而引入的附加结点(元素)均可称为哨兵。引入哨兵后使得查找循环条件的时间大约减少了一半,对于记录数较大的文件节约的时间就相当可观。类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技。
面试题25:编码实现冒泡排序
冒泡排序编程实现如下: #include
13
面试题26:编码实现直接选择排序 #include”stdio.h” #define LEN 9 void main( void ) { int ARRAY[LEN]={ 5, 6, 8, 2, 4, 1, 9, 3, 7 }; //待序数组 printf(“Before sorted:\n”); for( int m = 0; m < LEN; m++ ) //打印排序前数组 { printf( “%d “, ARRAY