c语言全排列栈特点序列,C语言用堆栈0到n-1的全排列.doc

C语言用堆栈0到n-1的全排列

C语言用堆栈0到n-1的全排列

本程序用C语言实现,采用多文件编译,从主函数中调用其接口函数即可.需要注意的是由于采用了堆栈,其运行效率并不是十分高.对于n阶,共有n!种情况.以下plzh代表排列组合. (本机运行环境是xpsp3+vc6.0++)

//头文件plzh.h

#ifndef PLZH_H

#define PLZH_H

#include

#include

void initial(int n);

int stackfull(int n);

void stackprint(int n);

void stackoutfile(int n);

void stackback();

void stackadd(int n);

void stackmov(int n);

void stackfun(int n);

#endif

//头文件实现函数 plzh.c

#include

#include

#include "plzh.h"

#define N 50 //定义栈的大小.

int stack[N]; //定义栈.

int p=-1; //定义栈底.

int a[N],b[N],c[N]; //分别表示当前数的值,改变后的值,及改变的次数.

FILE *pfile;

/**********************

*对栈进行初始化.

**********************/

void initial(int n)

{

int i=0;

for(i=0;i

{

stack[++p]=i; //第一次初始化的值.

a[i]=b[i]=i; //初始值相同.

c[i]=0; //0表示尚未改变过.

}

}

/***********************************************

*判断栈是否已满,在本程序中,此函数实际上是多余的.

***********************************************/

int stackfull(int n)

{

if(p+1==n)

return 1;

else

return 0;

}

/********************

*打印栈中的数值.

*此处是输出到屏幕上.

********************/

void stackprint(int n)

{

int i=0;

for(i=0;i

printf("%d ",stack[i]);

printf("\n");

}

/*************************

*也可输出到文件中.

*************************/

void stackoutfile(int n)

{

fwrite(stack,sizeof(int),n,pfile);

//FILE *pfile;

//int i;

//pfile=fopen("dat.txt","a+");

//for(i=0;i

//fprintf(pfile,"%d ",stack[i]);

//putw(stack[i],pfile);

//fprintf(pfile,"%c",'\n');

//fclose(pfile);

}

/***********************

*退栈.

*实际上这个可以省去,但为了更好理解,写成一个函数.

***********************/

void stackback()

{

p--;

}

/**********************************

*当经过一次退栈后,当前栈顶是p,则p+1到n-1

* 中并没有填充数字,此函数的作用就是为后面

* 的栈中重新入栈.

*并且此处是有规律的入栈.

**********************************/

void stackadd(int n)

{

int j,k,flag; //j,k是控制变量,flag是标志变量.

while(1+p

{

/************************

*此段的作用是使当前填充的值与前面的都不相同.

*用for循环控制.

************************/

for(j=0;j

{

flag=0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值