矿业大学(徐州)2022数据结构实验一



前言

考前复习用


问题 A: 一排里的位置交换

题目描述

体育课上,老师把一排里的两个身高不同的同学的位置交换了一下以方便安排分组训练。你能编程模拟这个过程吗?

输入

第一行是自然数n(n小于100),表示有n个数,第二行是n个表示身高的数据,第三行是要交换的两个同学的序号(按左起从1开始依次排序)。

输出

交换位置后的一排身高值。中间用空格间隔。

样例输入

5
152 155 120 145 160
2 5
样例输出

152 160 120 145 155

//法一
#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int* x = new int[n];
	for (int i = 0; i < n; i++)
		cin >> x[i];
	int a, b; cin >> a >> b;
	int temp = x[a - 1];
	x[a - 1] = x[b - 1];
	x[b - 1] = temp;
	for (int i = 0; i < n; i++)
		cout << x[i] << ' ';
}

链表和顺序表一样可以,但实验没必要,没事练习可以写写

问题 B: 围成圈

题目描述

假如有一次班里组织户外活动,同学们随机围坐成一圈做游戏,每个同学都记住了左右同学的编号,活动结束后,老师想让你帮忙复原当时大家坐的位置,你能通过每个同学记录的左右同学的编号,把当时大家坐的一圈情况复原吗?

输入

第一行是人数n(n<100)。从第二行开始n行,分别表示1-n编号的同学左右两个同学的编号。最后一行某个同学的编号K。

输出

围坐的这个圈里,从第K个同学开始顺时针的序列。

样例输入

5
4 5
5 3
2 4
3 1
1 2
3
样例输出

3 2 5 1 4

这道题会链表其实不难,注意审题。

#include<iostream>
using namespace std;
struct stu {
	int val;
	stu* left, * right;
};

int main()
{
	int n;
	cin >> n;
	stu* x = new stu[n];
	for (int i = 0; i < n; i++) {
		int a, b; cin >> a >> b;
		x[i].left = &x[a - 1];
		x[i].right = &x[b - 1];
		x[i].val = i + 1;
	}
	int y; cin >> y;
	stu* q(&x[y - 1]);
	while (n--) {
		cout << q->val << ' ';
		q = q->left;
	}
}

问题 C: 十进制整数转二进制

题目描述

二进制是计算机运算的基础,给你一个十进制整数,你能编程实现转二进制吗?

输入

第一行n,表示接着下边有n个十进制整数,每个占一行。

输出

对应每个十进制整数输出相应二进制数占一行。

样例输入

2
5
16
样例输出

101
10000

#include<iostream>
#include<string>
using namespace std;
void convert(int x) {
	char a[50], b[50];
	int i = 0;
	while (x) {
		if (x % 2 == 0)
			b[i] = '0';
		else
			b[i] = '1';
		x /= 2;
		i++;
	}
	int j;
	for ( j= 0; j < i; j++) {
		a[j] = b[i - j - 1];
	}
	a[j] = 0;
	cout << a << endl;
}
int main()
{
	int n;
	cin >> n;
	int* x = new int[n];
	for (int i = 0; i < n; i++) {
		cin >> x[i];
	}
	for (int i = 0; i < n; i++) {
		convert(x[i]);
	}
}

问题 D: 进出栈

题目描述

设栈S的初始状态为空,元素a, b, c, d, e, f, g 依次入栈,给你一个出栈序列,请编程判断出栈序列是否正确。

输入

占一行,为出栈序列。

输出

如果出栈学列是可能的,输出True,否则输出False。

样例输入

a b c d e f g

#include<iostream>
#include<stack>
using namespace std;
int main() {
	stack<char>s;
	char x[] = "abcdefg";
	int n = 7;
	char y[7]; int j = 0;
	for (int i = 0; i < n; i++)
		cin >> y[i]; bool falg(1);
	for (int i = 0; i < n; i++) {
		s.push('a' + i);
		while (falg)
		{
			if (y[j] == 'a' + i) { s.pop(); j++; }
			else falg = 0;
		}
		falg = 1;
	}
	if (s.empty())cout << "True";
	else cout << "Fasle";
}

问题 E: 栈容量

题目描述

设栈S的初始状态为空,元素a,b,c,d,e,f,g依次入栈,出栈顺序为b,d,c,f,e,a,g那么栈容量至少应该是3。如果任意给你一个出栈序列,你能编程判断相应的栈容量至少是多少吗?

输入

元素a,b,c,d,e,f,g依次入栈情况下的一种出栈序列。

输出

对应出栈序列的栈容量至少是多少。

样例输入

b d c f e a g
样例输出

3

#include<iostream>
#include<stack>
using namespace std;
int main() {
	stack<char>s;
	char a[8] = "abcdefg";
	char b[7];
	for (int i = 0; i < 7; i++)
		cin >> b[i];
	int k = 0, max(0);
	for (int i = 0; i < 7; i++) {
		s.push(a[i]);
		if (max < s.size())max = s.size();
		while (s.top() == b[k]) {
			k++; s.pop();
			if (s.size() == 0)break;
		}
	}
	cout << max;

}

注意栈为空时应停止出栈!

问题 F: 自创语言

题目描述

学了一段英语课之后,小名同学发现英语单词就是26个字母中若干个组合在一起的,于是他想自己也创立一种语言,为了简化单词,他计划只选26个小写字母的前n个符号构造长度也为n个符号的单词,构造好单词后,先要编写个词典,给每个单词有个解释以便人们学习他自创的语言。你能编程帮助按字典序输出所有长度为n的单词吗?

输入

占一行,为整数n(n<26)。

输出

所有由前n个符号构造长度也为n个符号的单词,按字典序每行输出一个单词。

样例输入

2
样例输出

aa
ab
ba
bb

递归表示n层循环嵌套,用非递归很难做

#include<iostream>
#include<stack>
using namespace std;
char a[27];
void print(int n, int m) {
	if (m == 0) {
		for (int i = 0; i < n; i++)
			cout << a[i];
		cout << endl;
	}
	else {
		for (int i = 0; i < n; i++) {
			a[n-m] = 'a' + i;
			print(n, m - 1);
		}
	}
}
int main() {
	int n;
	cin >> n;
	print(n, n);
}

问题 G: 离队

题目描述

体育课上,班上的同学排成了一排,结果有个同学突然感觉不适,需要去医院,就离队了,你能编程模拟离队后的状态吗?

输入

第一行是整数n(n<100),第二行有n个整数,第三行是k,表示从左开始第k个离队。

输出

输出离队后的数字序列。

样例输入

5
120 125 135 126 145
3
样例输出 

120 125 126 145

#include<iostream>
using namespace std;
int main()
{
	int n; cin >> n;
	int* x=new int[n];
	for (int i = 0; i < n; i++)
		cin >> x[i];
	int a; cin >> a;
	for (int i = 0; i < n; i++) {
		if (i == a - 1)continue;
		cout << x[i] << ' ';
	}
}

问题 H: 入队

题目描述

体育课上,上课铃响后,大家排成了一排,结果有一个同学迟到了,老师让他插在这一排的某个位置,你能编程模拟这个过程吗?

输入

第一行是整数n(n<100),第二行n个整数,第三行是整数m和要插入的位置k(位置从左往右依次从1排序)。

输出

入队后的n+1个数据序列。

样例输入

5
123 125 128 121 145
136 2
样例输出

123 136 125 128 121 145

#include<iostream>
using namespace std;
int main() {
	int n; cin >> n;
	int* a = new int[n+1];
	for (int i = 0; i < n; i++)
		cin >> a[i];
	int m, o; cin >> m >> o;
	for (int i = n; i > o-1 ; i--) {
		a[i] = a[i - 1];
	}
	a[o - 1] = m;
	for (int i = 0; i < n+1; i++) {
		cout << a[i] << ' ';
	}
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值