车厢调度程序

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream.h>
#define max 100
#define STACK_SIZE 100
#define STACKINCREMENT  10
typedef int  ElemType;
typedef int  Status;
typedef struct {
	ElemType *base;
	ElemType *top;
	int stacksize;
}SqStack;
Status InitStack(SqStack &S) //构造一个空栈S
{
	S.base=(ElemType *)malloc(STACK_SIZE*sizeof(ElemType));
if(!S.base)
exit(-1);
S.top=S.base;
S.stacksize=STACK_SIZE;
return 0;
}
Status push(SqStack &S,ElemType e) //插入元素e为新的栈顶元素
{
	if(S.top-S.base>=S.stacksize)
	{
        S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
	
if(!S.base)
exit(-1);
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
	*S.top++=e;
	return 0;
}
Status pop(SqStack &S,ElemType &e) //删除S的栈顶元素,并以e返回其值
{
	if(S.top==S.base)
		return -1;
	e=*--S.top;
	return e;
}
Status StackEmpty(SqStack &S) //如果栈S空栈,则返回1,否则返回0
{
	if(S.top==S.base)
		return 1;
	return 0;
}
void input(int j,int n,int path[],int start,SqStack &S)
{ 
	int m;

	int e;
	if(j<n)//当一个元素进入后,有两种选择,要么立刻出栈,或者下一个数的进栈
	{
		push(S,j+1);//选择把下一个压栈
        input(j+1,n,path,start,S);
        pop(S,e);//选择把下一个压栈进去的元素退出去,待会等待把自己退出去(恢复压栈前的初始状态)	
	}

  if(!StackEmpty(S))//当一个元素出去后,两种选择,要么继续出栈(栈不为空),或者下一个数的入栈。
{
	m=pop(S,e);
	path[start]=m;
	start++;
	input(j,n,path,start,S);//退出去以后继续调用
	push(S,m);//恢复退出前初始的状态
}
  if(j==n&&StackEmpty(S))
{
	for(int i=0;i<start;i++)
	printf("%2d",path[i]);
	printf("\t");
}
}
Status Combin(int m,int n)//计算出栈序列数
{

	 if (m<n||m<0||n<0)
	{
  	printf("输入不正确!\n");
    exit(-1);
	}
	 else if(m==n||n==0)return 1;
        else 
		return Combin(m-1,n)+Combin(m-1,n-1);
}
void menu();
Status set()
{ system( "cls ");
	SqStack S;     
	int n;
	int path[max];
    printf("输入车厢数目:");
    scanf("%d",&n);
	InitStack(S);
	push(S,1);
	printf("输出结果:\n");
    input(1,n,path,0,S);
	printf("以上是全部结果!共%d种\n", (Combin(2*n,n)/(n+1)));
	menu();
	return 1;
}
void menu()
{
	printf("                       制作                             \n");             
	printf("********************车厢调度程序********************         \n");
printf("------------------------------------------------------------------\n");
printf("1:信息输入                      0:退出系统 \n");
printf("        ----------------------------------------------------      \n");
cout<<"请你在上述功能中选择(0——1):"<<endl;
}
int main()
{
	char choice;
	printf("                      制作                             \n");             
	printf("********************车厢调度程序********************\n");
printf("------------------------------------------------------------------\n");
printf("1:信息输入                      0:退出系统 \n");
printf("        ----------------------------------------------------      \n");
cout<<"请你在上述功能中选择(0——1):"<<endl;

	do
	{
		choice=getchar();
		
		switch(choice)
		{
		case'1':set();break;
		case'0':exit(0); break;
		}
	}while(1);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值