有人可以帮我吗:这是一个程序,可以查找任何长度的字符串的所有排列。需要相同的非递归形式。(首选C语言实现)
using namespace std; string swtch(string topermute, int x, int y) { string newstring = topermute; newstring[x] = newstring[y]; newstring[y] = topermute[x]; //avoids temp variable return newstring; } void permute(string topermute, int place) { if(place == topermute.length() - 1) { cout<<topermute<<endl; } for(int nextchar = place; nextchar < topermute.length(); nextchar++) { permute(swtch(topermute, place, nextchar),place+1); } } int main(int argc, char* argv[]) { if(argc!=2) { cout<<"Proper input is 'permute string'"; return 1; } permute(argv[1], 0); return 0; }
基于堆栈的非递归代码:
#include <iostream> #include <string> struct State { State (std::string topermute_, int place_, int nextchar_, State* next_ = 0) : topermute (topermute_) , place (place_) , nextchar (nextchar_) , next (next_) { } std::string topermute; int place; int nextchar; State* next; }; std::string swtch (std::string topermute, int x, int y) { std::string newstring = topermute; newstring[x] = newstring[y]; newstring[y] = topermute[x]; //avoids temp variable return newstring; } void permute (std::string topermute, int place = 0) { // Linked list stack. State* top = new State (topermute, place, place); while (top != 0) { State* pop = top; top = pop->next; if (pop->place == pop->topermute.length () - 1) { std::cout << pop->topermute << std::endl; } for (int i = pop->place; i < pop->topermute.length (); ++i) { top = new State (swtch (pop->topermute, pop->place, i), pop->place + 1, i, top); } delete pop; } } int main (int argc, char* argv[]) { if (argc!=2) { std::cout<<"Proper input is 'permute string'"; return 1; } else { permute (argv[1]); } return 0; }
我尝试使其变得类似于C,并避免使用c ++ STL容器和成员函数(不过,为简单起见,使用了构造函数)。
请注意,排列是按照与原始顺序相反的顺序生成的。
我应该补充一点,以这种方式使用堆栈只是模拟递归。