用数组实现一个顺序打乱的栈
1.创建数组栈
以一30个单元的栈为例(这是一个存储指数为整数的一元多项式的栈):
typedef struct List{
int exponent;
int coefficient;
int next;
}list;
typedef struct Stack{
list data[n];
int top;
}stack;
stack S;
2.使用洗牌算法得到乱序数组
int i=0;
int rand_[n];
for(i=0;i<n;i++){
rand_[i]=(i+1)%n;
}
for(i=0;i<n;i++){
int r=rand()%n;
int t=rand_[r];
rand_[r]=rand_[i];
rand_[i]=t;
}
3.将乱序数组里的环解开
int i=0,head=0,tail=0;
//最终头节点是0,尾节点指向-1
int check[n];//检测此单元是否已经遍历过
int k=n;//记录还有多少单元没有遍历
for(i=0;i<n;i++){
check[i]=0;
}
while(k){
i=0;
while (check[i]) {
i++;
}
head=i;
check[i]=1;
k--;
while(check[rand_[i]]==0){
i=rand_[i];
check[i]=1;
k--;
}
if(tail)rand_[tail]=head;
tail=i;
rand_[tail]=-1;
}
4.将乱序数组的数据赋给栈指向下个节点的变量
S.top=0;
for(int i=0;i<n;i++){
S.data[i].next=rand_[i];
}
PS:附加内容–测量程序运行时间
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
clock_t start_,finish_;
double time;
start_=clock();
//程序内容
finish_=clock();
time=(double)(finish_-start_)/CLOCKS_PER_SEC;
printf("\n此程序运行了%f秒\n",time);
return 0;
}