面试题 7
2015-09-05 09:25
330 查看
1 题目描述
用两个栈实现一个队列,队列的声明如下,请事先它的两个函数,appendTail 和 deleteHead 分别完成从队列尾部插入节点和在对头部删除节点的功能。2 算法描述
appendTail:元素进队时,直接入栈 Stack1deleteHead : 若此时 Stack2 不为空,那么直接将 Stack2 栈顶元素出栈。若Stack2 为空,那么将 Stack1 中的元素依次出栈,然后在依次入栈 Stack2 ,最后将 Stack2 栈顶元素出栈。
C 语言实现
#include<stdio.h> typedef int ElemType; typedef struct node{ ElemType data; struct node* next; }SNode,*Stack; void initStack(Stack *stack){ //初始化头结点 (*stack)=(SNode*)malloc(sizeof(SNode)); (*stack)->data=-1; (*stack)->next=NULL; } //所有操作都在表头进行,头插法 int push(Stack stack,ElemType data){ SNode *push; //如果Stack尚未初始化 if(stack==NULL) return 0; push=(SNode*)malloc(sizeof(SNode)); push->data=data; push->next=stack->next; stack->next=push; } //出栈 int pop(Stack stack,ElemType* popVlaue){ //如果Stack为空 if(isEmpty(stack)) return 0; SNode *pop=stack->next; *popVlaue=pop->data; stack->next=pop->next; free(pop); return 1; } //获得栈顶元素 int getTop(Stack stack,ElemType* topVlaue){ //如果Stack为空 if(isEmpty(stack)) return 0; *topVlaue=stack->next->data; return 1; } //判断是否为空 int isEmpty(Stack stack){ return stack!=NULL&&stack->next==NULL?1:0; } //遍历Stack void showStack(Stack stack){ if(isEmpty(stack)) return; SNode* temp=stack->next; printf("----- stack elements:"); while(temp!=NULL){ printf(" %d",temp->data); temp=temp->next; } } //appendTail void appendTail(Stack s1,ElemType e){ push(s1,e); } //deleteHead void deleteHead(Stack s1,Stack s2,ElemType* e){ if(isEmpty(s2)){ while(!isEmpty(s1)){ ElemType temp; pop(s1,&temp); push(s2,temp); } } if(isEmpty(s2)){ printf("queue is empty"); }else{ pop(s2,e); } } void main(){ Stack stack1=NULL; Stack stack2=NULL; initStack(&stack1); initStack(&stack2); appendTail(stack1,1); appendTail(stack1,2); appendTail(stack1,3); appendTail(stack1,4); appendTail(stack1,5); appendTail(stack1,6); int _delete; deleteHead(stack1,stack2,&_delete); deleteHead(stack1,stack2,&_delete); deleteHead(stack1,stack2,&_delete); deleteHead(stack1,stack2,&_delete); appendTail(stack1,7); appendTail(stack1,8); showStack(stack1); printf("\n"); showStack(stack2); }
相关文章推荐
- PHP 程序员解决问题能力的八个级别
- 轻松搞定面试中的二叉树题目
- JAVA实现链表面试题
- C# 程序员最常犯的 10 个错误
- [.Net码农][hystar整理]Entity Framework 教程
- 腾讯后台开发面试题--整理2
- iOS面试题汇总 - 帮助弄清各种概念
- 十道海量数据处理面试题与十个方法大总结
- 关于PHP程序员解决问题的能力
- 程序员的激情其实是一种痛苦
- 链表面试题Java实现【重要】
- LeetCode趣题
- 动态规划
- 贪心法
- [转载]程序员的激情其实是一种痛苦
- 黑马程序员——45,内部类,多态,异常
- 面试题搜集
- 黑马程序员-Java基础:面向对象(上)
- 整理其他前端常见面试知识点
- 《剑指Offer》面试题:在 O(1)时间删除链表结点