哈哈。只考虑了两个小时左右,我已经深的递归精髓了,哈哈。
递归解决问题真的是太容易了,归纳演绎完全诠释了数学的精妙,
哈,这个世界好得很。。。。
重复感叹一句,迭代的是人,递归的是神。。。。
分析时间复杂度,公式为f(n)=2*f(n-1)+f(n-2),可以用递归求出通项,初略估计为3^n。
View Code
1 #include<iostream>
2 using namespace std;
3
4 class Stack
5 {
6 private:
7 int* elements;
8 int top;
9 int maxSize;
10 public:
11 Stack(int sz=50):top(-1),maxSize(sz)
12 {
13 elements=new int[maxSize];
14 }
15 int pop()
16 {
17 return elements[top--];
18 }
19 int push(int x)
20 {
21 elements[++top]=x;
22 }
23 bool isEmpty()
24 {
25 return (top==-1)?true:false;
26 }
27 friend ostream& operator<<(ostream& os,Stack& s);
28 };
29
30 ostream& operator<<(ostream& os,Stack& s)
31 {
32 for(int i=s.top;i>=0;i--)
33 os<<s.elements[i]<<"";
34 os<<endl;
35 return os;
36 }
37
38 void reverseStack(Stack& stack)
39 {
40 if(stack.isEmpty())
41 return ;
42 int temp1=stack.pop();
43 reverseStack(stack);
44 if(stack.isEmpty())
45 {
46 stack.push(temp1);
47 return;
48 }
49 int temp2=stack.pop();
50 reverseStack(stack);
51 stack.push(temp1);
52 reverseStack(stack);
53 stack.push(temp2);
54 }
55
56 void sort(Stack& stack)
57 {
58 if(stack.isEmpty())
59 return ;
60 int temp1=stack.pop();
61 sort(stack);
62 if(stack.isEmpty())
63 {
64 stack.push(temp1);
65 return ;
66 }
67 int temp2=stack.pop();
68 if(temp1>temp2)
69 {
70 stack.push(temp2);
71 stack.push(temp1);
72 }
73 else
74 {
75 stack.push(temp1);
76 sort(stack);
77 stack.push(temp2);
78 }
79 }
80
81 int main()
82 {
83 Stack s;
84 s.push(3);
85 s.push(2);
86 s.push(4);
87 s.push(1);
88 s.push(5);
89 cout<<s;
90 reverseStack(s);
91 cout<<s;
92 sort(s);
93 cout<<s;
94 return 0;
95 }