C++逆序栈问题和C语言选择排序数据

1、问题描述:

给你一个栈,要求只能使用递归,并且不能开辟额外的数据结构,将此栈进行逆序操作

2、思路求解:

我们如果想要逆序栈,首先要想办法拿到栈底元素,并且还需要将栈底上面的元素按照原顺序重新压入

例如我们有这个栈

C++逆序栈问题和C语言选择排序数据_第1张图片

我们需要一个函数,在不影响2,3顺序的情况,拿出1

我们可以这样:

先拿出一个元素,再判断是否为空

为空直接返回当前栈就一个元素,顶部当然是它本身

然后我们这样递归函数堆栈底层不断把答案往上返回

C++逆序栈问题和C语言选择排序数据_第2张图片

所以我们递归取得栈底的代码如下

C++逆序栈问题和C语言选择排序数据_第3张图片

我们的主函数中,就需要不断拿出栈底,在每层栈帧中记录拿到的值,再依次进行返回

C++逆序栈问题和C语言选择排序数据_第4张图片

3、C语言选择排序数据

问题描述:

给你一个任意的字符串,输出它所有的子序列

例如:“abc”

输出:“a”,“b”,“c”,“ab”,“ac”,“bc”,“abc”

思路求解:

我们这道题,其实无非就可以分解成两个情况某个字符选,还是不选

我们可以遍历每个字符串,分为它们选了,或者没选这两种情况来判断,直到所有字符判断完毕,再进行回溯判断

就像这样:

所有我们需要以下的参数

返回值数组vector,我们使用递归时,如果需要记录答案,最好将其作为引用参数

下标index,判断字符串中字符是否判断完毕

字符串path,记录当前的选择方法

以及我们的原数组

代码如下,详细可见注释

C++逆序栈问题和C语言选择排序数据_第5张图片

 

// 选择排序

#include

#include

// 交换两个变量的值。

void swap(int *x,int *y)

{

int itmp=*x;

*x=*y;

*y=itmp;

}

// 采用两层循环实现的方法。

// 参数arr是待排序数组的首地址,len是数组元素的个数。

void selectsort1(int *arr,unsigned int len)

{

if (len<2) return; // 数组小于2个元素不需要排序。

int ii;      // 排序的趟数的计数器。

int jj;      // 每趟排序的元素位置计数器。

int iminpos; // 每趟循环选出的最小值的位置(数组的下标)。

// 44,3,38,5,47,15,36,26,27,2,46,4,19,50,48

for (ii=0;ii

{

iminpos=ii;

for (jj=ii+1;jj

{

// 找出值更小的元素,记下它的位置。

if (arr[jj]

}

// 如果本趟循环的最小的元素不是起始位置的元素,则交换它们的位置。

if (iminpos!=ii) swap(&arr[ii],&arr[iminpos]);

}

}

// 采用递归实现的方法。

// 参数arr是待排序数组的首地址,len是数组元素的个数。

void selectsort2(int *arr,unsigned int len)

{

if (len<2) return; // 数组小于2个元素不需要排序。

int ii;        // 排序的趟数的计数器。

int iminpos=0; // 每趟循环选出的最小值的位置(数组的下标)。

for (ii=1;ii

{

// 找出值更小的元素,记下它的位置。

if (arr[ii]

}

// 如果本趟循环的最小的元素不是起始位置的元素,则交换它们的位置。

if (iminpos!=0) swap(&arr[0],&arr[iminpos]);

selectsort2(arr+1,--len);

}

int main(int argc,char *argv[])

{

int arr[]={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};

//int arr[]={3,4,5,1};

int len=sizeof(arr)/sizeof(int);

// selectsort1(arr,len);  // 采用两层循环排序的方法。

selectsort2(arr,len);  // 采用递归排序的方法。

// 显示排序结果。

int ii; for (ii=0;ii

printf("\n");

// system("pause");  // widnows下的C启用本行代码。

return 0;

}

你可能感兴趣的:(C++,数据结构)