用兩個棧實現一個隊列

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10

typedef struct _seqstack
{
	int data[MAXSIZE];
	int top;
}seqstack;

int Initstack(seqstack *s)//置空棧
{
	s->top = -1;
	return 0;
}

int Display(seqstack *s)//顯示隊列
{
	int n = 0;
	if(s->top == -1)
	{
		printf("隊爲空");
	}
	else
	{
		while(s->top >= n)
		{
			printf("%d  ",s->data[n]);
			n++;
		}
	}
	return 0;
}

int inqueue(int num,seqstack *s1,seqstack *s2)//進隊列
{
	if(s1->top == MAXSIZE - 1)//s1爲滿棧
	{
		printf("full\n");
	}
	else 
	{
		if(s2->top != -1)//s1不是滿棧且s2不是空棧
		{
			while(s2->top > -1)
			{
				s1->data[++s1->top] = s2->data[s2->top--];
			}
			s1->data[++s1->top] = num;	
		}
		else//s1不是滿棧且s2是空棧
		{
			s1->top++;
			s1->data[s1->top] = num;
		}
	}
	return 0;
}

int dequeue(seqstack *s1,seqstack *s2)//出隊列
{
	if(s2->top != -1)//s2不是空棧,直接彈出棧頂元素
	{
		printf("%d   ",s2->data[s2->top--]);
	}
	else//如果s2空棧且s1不是空棧,把s1元素倒入s2中
	{
		if(s1->top != -1)
		{
			while (s1->top != -1)
			{
				s2->data[++s2->top] = s1->data[s1->top--];
				printf("%d  ",s2->data[s2->top--]);
			}
		}
		else//如果s1和s2都是空棧
		{
			printf("empty\n");
		}
		
	}
	return 0;
}

int main()
{
	int i,j;
	int select;
	int choice = 1;
	int num;
	int account;
	
	seqstack s1;
	seqstack s2;
	
	Initstack(&s1);//將兩個棧置空
	Initstack(&s2);

	while(1)
	{
		printf("選擇操作:1.in  2.out  3.exit   \n");
		scanf("%d",&select);
		switch(select)
		{
			case 1:
			{
				printf("輸入元素個數:");
				scanf("%d",&account);
				
				printf("輸入數字:");
				for(i = 0;i < account;i++)
				{
					scanf("%d",&num);
					inqueue(num,&s1,&s2);
				}
				printf("隊列中數據如下:");
				Display(&s1);
				printf("\n");
				break;
			}
			case 2:
			{
				printf("出隊的元素:");
				dequeue(&s1,&s2);
				printf("\n");
				break;
			}
			case 3:
				exit(0);
				break;
		}
	}

	return  0;
}






















發佈了58 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章