匿名用户
1级
2011-01-04 回答
你可以考虑PM我详细商讨
//用栈结构实现辗转相除法计算两数最大公约数
#include
#include
#define MAXLEN 100
#define NEWLEN 10
//栈的结构相当于一个手枪子弹匣,每次只能拿到最上面一颗子弹
struct stack{ //栈结构体
int * base; //栈底
int top; //栈顶
int length; //栈高
};
typedef struct stack * p_stack, i_stack; //定义栈类型的结构体
p_stack stack_init(p_stack pstack)//初始化一个栈
{
pstack = NULL; //栈指针为空
pstack = (p_stack)malloc(sizeof(stack)); //为栈分配结构
if(pstack == NULL) //如果未分配成功(指针仍为空)则返回假
return false;
pstack->top = 0; //栈顶位置为0
pstack->base = (int *)malloc(sizeof(int) * MAXLEN); //为栈分配元素空间
pstack->length = MAXLEN; //栈高(容量)初始化
if(pstack->base == NULL) //如果空间未分配成功则释放栈结构,并返回假
{
free(pstack);
pstack = NULL;
return false;
}
return pstack; //返回栈指针
}
p_stack stack_exp(p_stack pstack)//给栈扩容
{
pstack->base = (int *)realloc(pstack->base, sizeof(int) * (pstack->length += NEWLEN)); //给栈重新分配空间,大小为(栈高+NEWLEN)
if(pstack->base == NULL) //如果分配不成功则释放并返回空
{
free(pstack);
pstack = NULL;
}
return pstack; //返回重新分配的空间指针
}
bool stack_release(p_stack pstack)//释放一个栈
{
free(pstack->base); //释放栈空间
free(pstack); //释放栈结构
pstack = NULL; //栈指针指向空
return true; //返回真
}
bool stack_push(p_stack pstack, int value)//压栈
{
if(pstack->top == pstack->length -1) //如果栈满了(栈顶下标=栈高-1),则为栈重新分配空间
stack_exp(pstack);
pstack->base[pstack->top ++] = value; //把值压入栈顶,栈顶指针向上移
return true;
}
int stack_top(p_stack pstack)//栈顶数据
{
return pstack->base[pstack->top - 1]; //返回栈顶数据
}
int stack_pop(p_stack pstack)//弹出
{
if(!pstack->top) //如果栈为空(栈顶下标为0)则返回-1
return -1;
return pstack->base[--(pstack->top)]; //返回栈顶内容,并将栈顶下调1
}
int func(p_stack pstack,int a,int b)//辗转相除法
{
int y,z;
stack_push(pstack,a); //把输入的第一个数压入栈顶
stack_push(pstack,b); //把输入的第二个数压入栈顶
while(1) //循环进行以下步骤
{
y = stack_top(pstack); //取得第一个栈顶数字
stack_pop(pstack); //栈顶数字出栈
z = stack_top(pstack); //取得第二个栈顶数字
if(0==z%y) //如果y能整除z,则y为两数最大公约数
return y;
stack_push(pstack,y); //否则将y压入栈顶
stack_push(pstack,z%y); //然后将z除以y的余数压入栈顶
}
}
int main()
{
p_stack pstack = NULL;
int a, b;
pstack = stack_init(pstack); //对栈初始化
printf("请输入两个整数,以空格分开\n"); //提示输入
scanf("%d %d", &a, &b); //从键盘输入两个整数
printf("最大公约数为:%d\n",func(pstack,a,b)); //调用辗转相除函数
stack_release(pstack); //调用结束,释放栈
return 0;
}