C语言用两个栈模拟队列

题目

在这里插入图片描述

解答
	#include<stdio.h>
	#include <stdlib.h>	//提供malloc、realloc、free、exit原型
	
	/* 宏定义 */
	#define STACK_INIT_SIZE	100	  //顺序栈存储空间的初始分配量
	#define STACKINCREMENT	10 	  //顺序栈存储空间的分配增量
	
	typedef struct{
		int *base;		//在栈构造之前和销毁之后,base的值为NULL 
		int *top;		//栈顶指针 
		int stacksize;	//当前已分配的存储空间,以元素为单位 
	}SqStack;
	
	/*构造空栈S*/
	int InitStack_Sq(SqStack *S){
	 	(*S).base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
		if(!(*S).base)
			exit(0);
			
		(*S).top = (*S).base;
	
		(*S).stacksize = STACK_INIT_SIZE;
		
		return 1;
	} 
	
	/*判断S是否为空*/
	int StackEmpty_Sq(SqStack S){
		if(S.top==S.base)
			return 1;
		else
			return 0;
	}
	
	/*元素e进栈*/
	int Push_Sq(SqStack *S, int e){
		if((*S).top-(*S).base>=(*S).stacksize){  //栈满,追加存储空间
			(*S).base = (int *)realloc((*S).base, ((*S).stacksize+STACKINCREMENT)*sizeof(int));
			if(!(*S).base)
				exit(0);  //存储分配失败
			(*S).top = (*S).base + (*S).stacksize;
			(*S).stacksize += STACKINCREMENT;
		}
		
		*(S->top) = e;	//进栈先赋值,栈顶指针再自增 
		(S->top)++;
	
		return 1;
	} 
	
	/*元素e出栈*/
	int Pop_Sq(SqStack *S, int *e){
		if((*S).top==(*S).base)
			return 0;
	
		(*S).top--;		//出栈栈顶指针先递减,再赋值 
		*e = *((*S).top);
	
		return 1;
	} 
	
	/*访问栈*/
	void StackTraverse_Sq(SqStack S){	//遍历不应该破坏栈  								
		int *p = S.base;
		while(p<S.top)
			printf("%d ", *p++);
		printf("\n");
	} 
	
	/*元素e入队列*/
	void EnQueue(SqStack *S1, int e){
		Push_Sq(S1, e); //把需要存放的元素插入到栈1中
	}
	
	/*元素e出队列*/
	int DeQueue(SqStack *S1, SqStack *S2){
		int e, tmp;
		/*如果栈1空栈,此时说明队列是空的*/
	    if(StackEmpty_Sq(*S1))
			exit(0);
	    /*如果栈2中有元素,那出队列就直接出栈2中的*/
	    if(!StackEmpty_Sq(*S2))
			Pop_Sq(S2, &e); //栈2栈顶元素出栈,栈2栈顶元素即为出队元素
	    /*如果栈2中没有元素,再要出队列的话,那就需要把栈1中的所有元素入栈到栈2中*/
	    /*注意一定要是栈1中的所有元素都入栈到栈2中*/
	    else{
	        while(!StackEmpty_Sq(*S1)){ //当栈1不为空时
				Pop_Sq(S1, &tmp); //栈1出栈,出栈元素赋给tmp
				Push_Sq(S2, tmp); //将tmp压入栈2
	        }
			Pop_Sq(S2, &e);  //栈2栈顶元素出栈,栈2栈顶元素即为出队元素
	    }
		return e; //返回出队元素
	}
	
	int main(){
		SqStack S1, S2;
		int i;
		printf("初始化顺序栈S1、S2 ...\n");					 
		InitStack_Sq(&S1);
		InitStack_Sq(&S2);
		for(i=1; i<=6; i++){
			printf("将 \"%2d\" 入模拟队 S1 ", 2*i);
			/*入队列:把需要存放的元素插入到栈1中*/
			EnQueue(&S1, 2*i);  
			printf("(累计第 %d 个元素)...\n", S1.top-S1.base);
		}
		printf("顺序栈S1中的元素为:\n");
		StackTraverse_Sq(S1);
		printf("顺序栈S2中的元素为:\n");
		StackTraverse_Sq(S2);
	
		/*出队列:把栈1中的元素依次插入到栈2中*/
		/*此时栈2的栈顶元素就是需要出队列的元素 */
		printf("用S1和S2模拟队列...\n");
		printf("队头元素 %d 出队列\n", DeQueue(&S1, &S2));
		printf("顺序栈S1中的元素为:\n");
		StackTraverse_Sq(S1);
		printf("顺序栈S2中的元素为:\n");
		StackTraverse_Sq(S2);
	
		return 0;
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值