您的位置:首页 > 其它

顺序栈和链栈实现汉洛塔

2011-04-22 19:23 543 查看
顺序栈:

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

#define STACKSIZE 10

typedef struct stack
{
int data[STACKSIZE];
int top;
}stack;

bool isempty(stack *ps)
{
return ps->top == -1;
}

void push(int num, stack *ps)
{
(ps->top)++;
(ps->data)[ps->top] = num;
}

int pop(stack *ps)
{
if(!isempty(ps)){
int ret = (ps->data)[ps->top];
(ps->data)[ps->top] = 0;
ps->top--;
return ret;
}
else
return 0;
}

void show(int hanois, stack *ps1, stack *ps2, stack *ps3)
{
int i;
for(i=0; i<hanois; i++){
printf("%d/t%d/t%d/n", (ps1->data)[hanois-i-1],
(ps2->data)[hanois-i-1], (ps3->data)[hanois-i-1]);
}
printf("-----------------/n");
}

void towers_of_hanoi(int hanois, stack *ps1, stack *ps2, stack *ps3)
{
int tmp;
if(hanois > 0){
towers_of_hanoi(hanois-1, ps1, ps3, ps2);

tmp = pop(ps1);
push(tmp, ps2);

towers_of_hanoi(hanois-1, ps3, ps2, ps1);
}
}

void init(stack *ps, int hanois)
{
int i;
ps->top = -1;

for(i=0; i<hanois; i++){
push(hanois-i, ps);
}
}

int main(void)
{
printf("how many hanois ? ");
int hanois;
scanf("%d", &hanois);

if(hanois > STACKSIZE){
printf("too big/n");
return 0;
}

static stack s1, s2, s3;

init(&s1, hanois);
init(&s2, 0);
init(&s2, 0);

show(hanois, &s1, &s2, &s3);
towers_of_hanoi(hanois, &s1, &s2, &s3);
show(hanois, &s1, &s2, &s3);

return 0;
}

链栈实现:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct stack
{
int data;
struct stack *next;
}stack;

void push(int num, stack **p2top)
{
stack *new_node = (stack *)malloc(sizeof(stack));
new_node -> data = num;
new_node -> next = *p2top;
*p2top = new_node;
}

int pop(stack **p2top)
{
int ret;

if(*p2top != NULL){
ret = (*p2top) -> data;
*p2top = (*p2top) -> next;
}
else
return 0;

return ret;
}

void show(int hanois, stack *top1, stack *top2, stack *top3)
{
int i, tmp __attribute__((unused));
for(i=0; i<hanois; i++){
printf("%d/t%d/t%d/n", pop(&top1), pop(&top2), pop(&top3));
}
printf("-----------------/n");
}

void towers_of_hanoi(int hanois, stack **p2top1, stack **p2top2, stack **p2top3)
{
int tmp;
if(hanois > 0){
towers_of_hanoi(hanois-1, p2top1, p2top3, p2top2);

tmp = pop(p2top1);
push(tmp, p2top2);

towers_of_hanoi(hanois-1, p2top3, p2top2, p2top1);
}
}

void init(stack **p2top, int hanois)
{
int i;
if(hanois > 0){
for(i=0; i<hanois; i++){
push(hanois-i, p2top);
}
}
else
return;
}

int main(void)
{
printf("how many hanois ? ");
int hanois;
scanf("%d", &hanois);

stack *top1 = NULL, *top2 = NULL, *top3 = NULL;
init(&top1, hanois);

show(hanois, top1, top2, top3);
towers_of_hanoi(hanois, &top1, &top2, &top3);
show(hanois, top1, top2, top3);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: