[C语言]栈的基本操作 使用两个栈模拟队列

#include<stdio.h>
#include <stdlib.h>
typedef struct stackNode
{
	int data;
	struct stackNode *next;
}sNode;

typedef struct myStack
{
	sNode *bottom;
	sNode *top;
}myStack;

//建立栈
myStack* createStack()
{
	myStack *s = (myStack*)malloc(sizeof(myStack));
	s->bottom = NULL;
	s->top = NULL;
	return s;
}

//入栈
void pushStack(myStack *s,int i)
{
	sNode *node;
	node = (sNode*)malloc(sizeof(sNode));
	node->data = i;
	if(s->bottom == NULL)
	{
		s->bottom = node;
		s->top = node;
		node->next = NULL;
	}else{	
		node ->next = s->top;
		s->top = node;		
	}
}

//出栈
int popStack(myStack *s)
{
	sNode *node;
	int out;
	if(s->bottom == NULL)
	{
		printf("the is stack is empty. \n");
		return 0;
	}
	if(s->bottom == s->top)
	{
		node = s->top;
		out = node ->data;
		s->bottom = NULL;
		s->top = NULL;
		free(node);
		return out;
	}
	node = s->top;
	out = node ->data;
	s->top = node->next;
	free(node);
	return out;
}


//从栈顶开始顺序打印栈
void printStack(myStack *s)
{
	sNode *p;
	p = s->top;
	while(p)
	{
		printf("%d  ",p->data);
		p = p->next;
	}
}

void main()
{
	myStack *s;
	int i,p;

	s = createStack();

	for(i=1;i<=10;i++)
		pushStack(s,i);

	for(i=1;i<=13;i++)
	{
		p = popStack(s);
		printf("pop data is: %d \n", p);
	}

	printStack(s);
}


 

使用两个栈模拟队列:

#include<stdio.h>   
#include <stdlib.h>   
typedef struct stackNode  
{  
    int data;  
    struct stackNode *next;  
}sNode;  
  
typedef struct myStack  
{  
    sNode *bottom;  
    sNode *top;  
}myStack;  

typedef struct stackQueue
{
	myStack *inStack;
	myStack *outStack;
}sQueue;

//建新栈
myStack* createStack()  
{  
    myStack *s = (myStack*)malloc(sizeof(myStack));  
    s->bottom = NULL;  
    s->top = NULL;  
    return s;  
}  
  
//入栈   
void pushStack(myStack *s,int i)  
{  
    sNode *node;  
    node = (sNode*)malloc(sizeof(sNode));  
    node->data = i;  
    if(s->bottom == NULL)  
    {  
        s->bottom = node;  
        s->top = node;  
        node->next = NULL;  
    }else{    
        node ->next = s->top;  
        s->top = node;         
    }  
}  
  
//出栈   
int popStack(myStack *s)  
{  
    sNode *node;  
    int out;  
    if(s->bottom == NULL)  
    {  
        printf("the is stack is empty. \n");  
        return 0;  
    }  
    if(s->bottom == s->top)  
    {  
        node = s->top;  
        out = node ->data;  
        s->bottom = NULL;  
        s->top = NULL;  
        free(node);  
        return out;  
    }  
    node = s->top;  
    out = node ->data;  
    s->top = node->next;  
    free(node);  
    return out;  
}  
  
  
//从栈顶开始顺序打印栈   
void printStack(myStack *s)  
{  
    sNode *p;  
    p = s->top;  
    while(p)  
    {  
        printf("%d  ",p->data);  
        p = p->next;  
    }  
}  

//建立新队列,由两个栈构成
sQueue* createStackQueue()
{
	sQueue *q; 
	myStack *inStack,*outStack;

	q = (sQueue*)malloc(sizeof(sQueue));
	inStack = createStack();
	outStack = createStack();
	q->inStack = inStack;
	q->outStack = outStack;

	return q;
}

//入队列
void inQueue(sQueue *q , int i)
{
	pushStack(q->inStack,i);
}

//出队列
int outQueue(sQueue *q)
{
	int outData,temp;
	if(q->outStack->bottom != NULL)
	{
		outData = popStack(q->outStack);
		return outData;
	}else if(q->inStack->bottom != NULL)
	{
		while(q->inStack->bottom != NULL)
		{
			temp = popStack(q->inStack);
			pushStack(q->outStack,temp);
		}
		outData = popStack(q->outStack);
		return outData;
	}else{
		printf("\n the queue is empty \n");
		return -1;
	}
}

void main()
{
	sQueue *q;
	int i,out;
	q = createStackQueue();

	for(i=1;i<=10;i++)
		inQueue(q,i);
	
	for(i=1;i<=5;i++)
	{
		out = outQueue(q);
		printf("%d  ",out);
	}
	printf("\n");

	for(i=11;i<=15;i++)
		inQueue(q,i);
	

	for(i=1;i<=7;i++)
	{
		out = outQueue(q);
		printf("%d  ",out);
	}
	printf("\n");
	


}
	


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值