#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;
}
车厢调度程序
最新推荐文章于 2021-05-23 09:19:12 发布