算法导论学习10.1 两个栈共享一个数组 and 两个栈实现一个队列 and 两个队列实现一个栈
来源:互联网 发布:生成淘宝店铺代码 编辑:程序博客网 时间:2024/05/22 10:48
ArrayStack.h (顺序栈的基本操作)
#include <stdio.h>#include <stdlib.h>#define MAXNUM 4#define OVERFLOW -1#define UNDERFLOW -2typedef int elemtype;//顺序栈typedef struct ArrayStack{elemtype data[MAXNUM];int top;}ArrayStack;//栈的置空void InitStack(ArrayStack *s){s->top = -1;}//判栈空int IsEmpty(ArrayStack *s){return (-1 == s->top);}//判栈满int IsFull(ArrayStack *s){return (MAXNUM - 1 == s->top);}//进栈void Push(ArrayStack *s, elemtype x){if (IsFull(s)){printf("Stack overflow!\n");exit(OVERFLOW);}else{s->top += 1;s->data[s->top] = x;}}//出栈elemtype Pop(ArrayStack *s){if (IsEmpty(s)){printf("Stack underflow!");exit(UNDERFLOW);}else{return (s->data[s->top--]);}}//取栈顶elemtype Top(ArrayStack *s){if (IsEmpty(s)){printf("Stack is Empty!");return NULL;}else{return (s->data[s->top]);}}//栈的长度int Length(ArrayStack *s){return (s->top + 1);}//栈的遍历void StackTraverse(ArrayStack *s){int i = 0;if (IsEmpty(s)){printf("Stack is Empty!\n");}else{for (i = 0; i < Length(s); i++){printf("%d ", s->data[i]);}printf("\n");}}
#include <stdio.h>#include <stdlib.h>#define MAXNUM 3#define OVERFLOW -1#define UNDERFLOW -2typedef int elemtype;//顺序队列typedef struct ArrayQueue{elemtype data[MAXNUM + 1];int front;int tail;}ArrayQueue;//队列的初始化void InitQueue(ArrayQueue *q){q->front = 0;q->tail = 0;}//判队满int IsFull(ArrayQueue *q){return ( (q->tail + 1) % (MAXNUM + 1) == q->front );//应该跟MAXNUM + 1求余}//判队空int IsEmpty(ArrayQueue *q){return (q->tail == q->front);}//入队void EnQueue(ArrayQueue *q, elemtype x){if (IsFull(q)){printf("Queue overflow!");exit(OVERFLOW);}else{q->tail = (q->tail + 1) % (MAXNUM + 1);q->data[q->tail] = x;} }//出队elemtype DeQueue(ArrayQueue *q){if (IsEmpty(q)){printf("Queue underflow!");exit(UNDERFLOW);}else{q->front = (q->front + 1) % (MAXNUM + 1);//q->data[q->front]不属于队列return (q->data[q->front]);}}//取队头elemtype Front(ArrayQueue *q){if (IsEmpty(q)){printf("ArrayQueue is Empty!");return NULL;}else{return q->data[q->front + 1];}}//队的长度int Length(ArrayQueue *q){return (q->tail - q->front + MAXNUM) % MAXNUM;}
1. 用一个数组A[1..n]来实现两个栈,使得两个栈中的元素总数不到n时, 两者都不会发生上溢.
思路:将数组的两端分别对应两个栈的栈底,每个栈的压栈操作都向着另一个栈的栈底进行.
1Arr2Stack.c
#include <stdio.h>#include <stdlib.h>#define MAXNUM 4#define OVERFLOW -1#define UNDERFLOW -2#define FLAGERROR -3typedef int elemtype;typedef struct stack{int top;int flag;}stack;typedef struct ShareArrStack{elemtype data[MAXNUM];stack stack1;stack stack2;}ShareArrStack;//初始化void InitStack(ShareArrStack *s){(s->stack1).top = -1;(s->stack1).flag = 1;(s->stack2).top = MAXNUM;(s->stack2).flag = 2;}//判栈满int IsFull(ShareArrStack *s){return (s->stack1.top + 1 == s->stack2.top);}//判栈空int IsEmpty(stack *sn){return ((sn->top == -1) || (sn->top == MAXNUM));}//Pushvoid Push(ShareArrStack *s, stack sn, elemtype x){if (IsFull(s)){printf("Stack overflow!");exit(OVERFLOW);}else{switch (sn.flag){case 1:{s->stack1.top += 1;s->data[s->stack1.top] = x;break;}case 2:{s->stack2.top -= 1;s->data[s->stack2.top] = x;break;}default:{exit(FLAGERROR);}}}}//Popelemtype Pop(ShareArrStack *s, stack sn){if (IsEmpty(&sn)){printf("stack underflow!");exit(UNDERFLOW);}else{switch(sn.flag){case 1:{return (s->data[s->stack1.top --]);break;}case 2:{return (s->data[s->stack2.top ++]);break;}default:{exit(FLAGERROR);}}}}int main(){ShareArrStack *s = NULL;s = (ShareArrStack *)malloc(sizeof(ShareArrStack));InitStack(s);Push(s, s->stack1, 1);Push(s, s->stack2, 9);Push(s, s->stack1, 2);Push(s, s->stack2, 8);printf("%d, ", Pop(s, s->stack2));printf("%d", Pop(s, s->stack1));return 0;}
2. 用两个栈来实现一个队列
思路:http://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html
Stack2Queue.c
#include "ArrayStack.h"//此处假设两个栈的大小是相同的,不等又会怎样?typedef struct Stack2Queue{ArrayStack *s1;ArrayStack *s2;}Stack2Queue;//队列置空void thisInitQueue(Stack2Queue *q){q->s1 = (ArrayStack *)malloc(sizeof(ArrayStack));InitStack(q->s1);q->s2 = (ArrayStack *)malloc(sizeof(ArrayStack));InitStack(q->s2);}//判队空int thisIsEmpty(Stack2Queue *q){return( IsEmpty(q->s1) && IsEmpty(q->s2) );}//判队满int thisIsFull(Stack2Queue *q){return ( IsFull(q->s1) || IsFull(q->s2) );}//进队void thisEnQueue(Stack2Queue *q, elemtype x){if (thisIsFull(q)){printf("Queue overflow!");exit(OVERFLOW);}else if (!IsEmpty(q->s2)){while(!IsEmpty(q->s2)){Push(q->s1, Pop(q->s2));}}Push(q->s1, x);}//出队elemtype thisDeQueue(Stack2Queue *q){if (thisIsEmpty(q)){printf("Queue underflow!");exit(UNDERFLOW);}else if (IsEmpty(q->s2)){while(Length(q->s1) != 1){Push(q->s2, Pop(q->s1));}return(Pop(q->s1));}else{return(Pop(q->s2));}}int main(){Stack2Queue *q = NULL;q = (Stack2Queue *)malloc(sizeof(Stack2Queue));thisInitQueue(q);thisEnQueue(q, 1);thisEnQueue(q, 2);thisEnQueue(q, 3);thisEnQueue(q, 4);thisDeQueue(q);thisDeQueue(q);thisEnQueue(q, 5);thisDeQueue(q);return 0;}
3. 用两个队列来实现一个栈
思路:栈的push操作:入队;
栈的pop操作:将队列A中除了队尾外的数据 依次出队, 并入队到队列B中。最后队列A只剩下队头,将对头出队,就是pop操作。
Queue2Stack.c
#include "ArrayQueue.h"//两个队列组成一个栈typedef struct Queue2Stack{ArrayQueue *q1;ArrayQueue *q2;}Queue2Stack;//栈置空void thisInitStack(Queue2Stack *s){s->q1 = (ArrayQueue *)malloc(sizeof(ArrayQueue));InitQueue(s->q1);s->q2 = (ArrayQueue *)malloc(sizeof(ArrayQueue));InitQueue(s->q2);}//判栈空int thisIsEmpty(Queue2Stack *s){return ( IsEmpty(s->q1) && IsEmpty(s->q2));}//判栈满int thisIsFull(Queue2Stack *s){return ( IsFull(s->q1) || IsFull(s->q2));}//进栈void thisPush(Queue2Stack *s, elemtype x){if ( thisIsFull(s) ){printf("stack overflow!");exit(OVERFLOW);}else if(!IsEmpty(s->q2)){EnQueue(s->q2, x);}else{EnQueue(s->q1, x);}}//出栈elemtype thisPop(Queue2Stack *s){if (thisIsEmpty(s)){printf("stack underflow!");exit(UNDERFLOW);}else if (!IsEmpty(s->q2)){while ( Length(s->q2) != 1 ){EnQueue( s->q1, DeQueue(s->q2) );}return (DeQueue(s->q2));}else{while (Length(s->q1) != 1){EnQueue(s->q2, DeQueue(s->q1));}return (DeQueue(s->q1));}}int main(){Queue2Stack *s = NULL;s = (Queue2Stack *)malloc(sizeof(Queue2Stack));thisInitStack(s);thisPush(s, 1);thisPush(s, 2);thisPush(s, 3);thisPop(s);thisPush(s, 4);return 0;}
- 算法导论学习10.1 两个栈共享一个数组 and 两个栈实现一个队列 and 两个队列实现一个栈
- 算法导论 用两个队列实现一个栈 10.1-7
- 两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】
- [算法学习]两个栈实现一个队列
- 算法导论基础篇:两个栈实现一个队列
- 算法导论基础篇:两个队列实现一个栈
- 算法导论 使用两个队列实现一个栈
- 【栈队列】一个数组实现两个栈(共享栈)
- 两个队列实现一个栈&两个栈实现一个队列
- 两个栈实现一个队列-----两个队列实现一个栈
- 两个栈实现一个队列&&两个队列实现一个栈
- 两个栈实现一个队列 && 两个队列实现一个栈
- 两个栈实现一个队列,两个队列实现一个栈
- 两个栈实现一个队列/两个队列实现一个栈
- 两个栈实现一个队列&两个队列实现一个栈
- 两个队列实现一个栈&两个栈实现一个队列
- 两个队列实现一个栈 / 两个栈实现一个队列
- 两个栈实现一个队列,两个队列实现一个栈
- Linux 共享库: LD_LIBRARY_PATH 与ld.so.conf
- 懒人日记12
- 转行与创业之路(3)
- 安装Windows 7 "安装程序无法创建新的系统分区"
- 代码写Button遇到问题
- 算法导论学习10.1 两个栈共享一个数组 and 两个栈实现一个队列 and 两个队列实现一个栈
- 懒人日记13
- 似乎又站在了十字路口
- 懒人日记14-惰性定律
- 懒人日记15-纳兰德性第二定律
- 介绍Java中的assert用法
- 懒人日记16
- 懒人日记17
- 懒人日记18