1. 程式人生 > >C語言 兩個棧實現佇列的操作

C語言 兩個棧實現佇列的操作

思路:

1,先初始化兩個具有一定儲存空間的空棧

2,把元素壓入棧1,完成入隊操作。由於棧是後進先出的,要實現佇列的功能(即先進先出)必須藉助另一個棧來實現

3,完成出隊的操作,先把棧1的棧頂元素依次彈出並壓入棧2,直到棧1的棧低元素。這樣棧2中從棧頂到棧底的元素依次是壓入棧1的順序了。這樣可以把棧2的元素依次彈出,實現了佇列的出隊操作。

4,如果,元素沒有完全出隊,而又有新元素要入隊時。此時,棧2中是還有元素沒有完全彈出的。同樣先把,元素壓入棧1,。

5,此時要完成出佇列操作,由於棧2中還有元素,意味著棧2中這些元素比新壓入棧1的元素先到佇列,應該先出隊。那麼只要棧2中還有元素,就從棧2中彈出元素完成出隊操作;否則把棧1中的元素依次彈出並壓入棧2。探後從棧2中,彈出元素完成出隊操作。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include <iostream>

#define STACK_INIT_SIZE sizeof(struct stack)*10
#define STACKINCREASWMENT sizeof(struct stack)

struct stack{
	int *base;
	int *top;
	int stacksize;
};

int initStack(stack *s)//構造一個空棧
{
	s->base = (int *)malloc(sizeof(struct stack)*STACK_INIT_SIZE);
	if(s->base == NULL)
		exit(-1);
	s->top = s->base;
	s->stacksize = STACK_INIT_SIZE;
	return 1;
}

int push(stack *s,int num)//壓棧
{
	//先判斷棧的記憶體是否夠用,不夠用需要從新分配記憶體
	if(s->top - s->base >= s->stacksize - sizeof(struct stack))
		s->base = (int *)realloc(s->base,s->stacksize + sizeof(struct stack));
	if(s->base == NULL) //記憶體分配失敗
		exit(-1);
	*s->top++ = num;//注意 優先順序
	return 1;
}

int pop(stack *s)//彈棧
{
	if(s->base == s->top)//空棧,無棧可彈
		return -1;
	return *(--s->top);
}
/*
stack addElementToQueen(int nums[],int length)
{
	if(sizeof(nums)/sizeof(int) != length)
		exit(-1);
	stack s;
	initStack(&s);
	for(int i=0;i<length;i++)
	{
		push(&s,*(nums + i));
	}
	return s;
}
int deleteElementInQueen(struct stack s1)
{
	stack s2;
	initStack(&s2);
	int n;
	if(s2->top - s2->base <= 0)
	{
		while((s1->top - s1->base) >= 0)
		{
			n = s1->top;
			pop(&s1);
			push(&s2,n);
		}
	}
	if(s2->top - s2->base == 0)//換棧失敗
		return NULL;
	n = pop(s2);
	return n;
}
*/
void main()
{
	stack s1,s2;
	initStack(&s1);
	initStack(&s2);
	int nums[] = {1,2,3,4,5,6};
	printf("壓入棧 1\n");
	for(int i=0;i<6;i++)
	{
		push(&s1,*(nums + i));
	}
	printf("出隊的順序為:\n");
	while(s1.base != s1.top)
	{
		while(s1.top - s1.base >1)
			push(&s2,pop(&s1));
		printf("%d \t",pop(&s1));
		while(s2.top - s2.base > 0)
			push(&s1,pop(&s2));
	}
	printf("\n");
}