首页 > 代码库 > 从两端生长的双向栈-C语言版

从两端生长的双向栈-C语言版

<pre name="code" class="cpp">[cpp]  简单双端栈的应用
源文件部分:
#include <stdio.h>
#define MaxStackSize 100
typedef int DataType;
int len,x;
#include"SeqStack.h"
int main()
{
	SeqStack myStack;
	int i,n,m;
	StackInitiate(&myStack);
	for(i=0;i<10;i++)            
		StackPush(&myStack,i+1,1);      
	StackPrint(myStack,1);
	StackPrint(myStack,2);
	printf("请输入你要插入的元素以及要插入的几号栈:\n");
	scanf("%d%d",&n,&m);
	StackPush(&myStack,n,m);
	printf("插入后得到如下序列:\n");
	StackPrint(myStack,1);
	StackPrint(myStack,2);
	StackPop(&myStack,&x,m);
	StackTop(myStack,&x,m);
	printf("删除后得到如下序列:\n");
	StackPrint(myStack,1);
	StackPrint(myStack,2);
	return 0;
}
头文件部分:
typedef struct
{
	DataType stack[MaxStackSize];         //栈的申明定义    
	int top1;
	int top2;
}SeqStack;

void StackInitiate(SeqStack *S)      //栈的初始化操作   
{
	S->top1=0;                 //不舍弃数组的存储单元  ---第二种方法
	S->top2=MaxStackSize-1;
}

int StackNotEmpty(SeqStack S,DataType where)     //判空      
{
	if(where==1)
	{
		if(S.top1<=0)       //判空   
			return 0;
		return 1;
	}
	else
	{
		if(S.top2>=MaxStackSize-1)
			return 0;
		return 1;   //不符合就未空
	}
}

int StackPush(SeqStack *S,DataType x,DataType where)         //入栈  
{
	if(S->top1+1==S->top2)              //判满
	{
		printf("堆栈已满无法插入!\n");
		return 0;
	}
	else                                      //未满则进行插入操作   
	{
		if(where==1)
		{	
			S->stack[S->top1]=x;
			S->top1++;
		}
		else                                  //选择插入的栈号进行插入操作  
		{
			S->stack[S->top2]=x;
			S->top2--;
		}
	}
	return 1;
}

int StackPop(SeqStack *S,DataType *d,DataType where)        //出栈          
{
	if(where==1)
	{
		if(S->top1<=0)
		{
			printf("1号栈是空的,无数据元素出栈!\n");
			return 0;
		}
		S->top1--;
		*d=S->stack[S->top1];
	}
	else
	{
		if(S->top2>=MaxStackSize-1)
		{
			printf("2号栈是空的,无数据元素出栈!\n");
			return 0;
		}
		S->top2++;
		*d=S->stack[S->top2];
	}
	return 1;
}

int StackTop(SeqStack S,DataType *d,DataType where)        //返回栈顶元素   
{
	if(where==1)
	{
		if(len<=0)
		{
			printf("1号栈已空无数据元素出栈!\n");
			return 0;
		}
		*d=S.stack[len-1];
	}
	else
	{
		if(len>MaxStackSize-1)
		{
			printf("2号栈已空无数据元素出栈!\n");
			return 0;
		}
		*d=S.stack[len+1];
	}
	return 1;
}                       //使用时忘记保存头文件代码会造成什么错误 

void StackPrint(SeqStack S,DataType where)         //打印函数
{
	if(where==1)
	{
		len=S.top1;
		if(len<=0)
		{
			printf("1号栈已空,无元素输出.\n");
			return ;
		}
		printf("1号栈内元素如下:\n");
		while(len>0)
		{
			StackTop(S,&x,1);
			printf("%d ",x);
			len--;
		}
		printf("\n");
		return ;
	}
	else
	{
		len=S.top2;
		if(len>=MaxStackSize-1)
		{
			printf("2号栈已空无数据元素出栈!\n");
			return ;
		}
		printf("2号栈内元素如下:\n");
		while(len<MaxStackSize-1)
		{
			StackTop(S,&x,2);
			printf("%d ",x);
			len++;
		}
		printf("\n");
		return ;
	}
	return ;
}



从两端生长的双向栈-C语言版