我需要使用堆栈来计算n的阶乘,而我所做的代码不会返回任何结果。我也不知道什么是pop堆栈(它的第二个参数是什么)所以我只是在那里使用了一个随机值。我使用了int **x;
,因为我不知道该放什么pop(&mystack,*x);
。
#include <iostream>
using namespace std;
int n;
int aux;
int aux1;
int aux2;
int **x;
typedef struct {
int content[100];
int top;
} stack;
stack mystack;
int push(stack *somestack,int somevalue)
{
if (somestack->top+1>=100)
return 1;
(*somestack).top++;
(*somestack).content[(*somestack).top]=somevalue;
return 0;
}
int pop(stack *somestack, int *oldvalue)
{
if((*somestack).top==0)
{
return 1;
}
*oldvalue=(*somestack).content[(*somestack).top];
return 0;
}
int main()
{
cout<<"n=";
cin>>n;
push(&mystack,n);
int direction=1;
while(mystack.top>=1)
{
if((direction==1)&&(mystack.content[mystack.top]>1))
{
aux=mystack.content[mystack.top];
push(&mystack,aux-1);
}
else
{
if(mystack.content[mystack.top]==1)
{
direction=0;
}
else
{
if(aux1<n)
{
aux1=mystack.content[mystack.top];
aux2=aux1*(aux1+1);
pop(&mystack,*x);
mystack.content[mystack.top]=aux2;
}
}
}
}
cout<<endl<<mystack.content[0];
return 0;
}
答案 0 :(得分:4)
堆栈具有推送和弹出操作。 Push会在堆栈顶部添加一个新项目,pop会从堆栈顶部删除该项目并将其返回。对于阶乘的一些伪代码:
int factorial(int n) {
Stack<int> stack;
stack.push(1);
for(int i=1; i<=n; ++i) {
stack.push(stack.pop()*i);
}
return stack.pop();
}
答案 1 :(得分:0)
使用解释器模式,它只不过是将n..2中的数字放入堆栈中(不包括1,因为它是基本情况)
package main
import "github.com/ayalaio/utils/stack"
type MathFact struct {
Content int
}
func (self *MathFact) FactorialFunc() func(int) int {
return func(j int) int {
return self.Content * j
}
}
func main() {
s := stack.New()
factorialOf := 6
curr := factorialOf
for curr >= 2 {
s.Add(&MathFact{curr})
curr--
}
// 1 -> base case
r := 1
for s.Len() > 0 {
e := s.Front()
ff := e.Value.(*MathFact).FactorialFunc()
r = ff(r)
s.Remove()
}
println(r)
}
答案 2 :(得分:-1)
这就是我在没有递归的情况下对数字进行因式分解(使用堆栈)。
ChildsName | MembershipType | TotalPoints
=========================================
Arya Stark | Senior | 15
Rob Stark | Senior | 69
Tyrion | Senior | 6215
Jon Snow | Intermediate | 48
HODOR | Intermediate | 67
Cersei | Intermediate | 789
Ned Stark | Junior | 5
Daenerys | Junior | 16
Bran Stark | Junior | 456