T1
用顺序存储实现栈的初始化、入栈、出栈、取栈顶、判栈空操作。调用以上操作实现判断从键盘输入的括号序列是否匹配
输入描述
括导序列#(#为括号输入结束符号)
输出描述
匹配或不匹配
输入
{[()]}#
输出
匹配
#include <iostream>
using namespace std;
const int MAX_SIZE = 100;
class Stack {
private:
char data[MAX_SIZE];
int top;
public:
Stack() {
top = -1;
}
void init() {
top = -1;
}
bool push(char item) {
if (top == MAX_SIZE - 1) {
return false;
}
data[++top] = item;
return true;
}
char pop() {
if (top == -1) {
return '\0';
}
return data[top--];
}
char peek() {
if (top == -1) {
return '\0';
}
return data[top];
}
bool isEmpty() {
return top == -1;
}
};
bool isMatchingBrackets(string input) {
Stack stack;
stack.init();
for (char c : input) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
}
else if (c == ')' || c == ']' || c == '}') {
if (stack.isEmpty()) {
return false;
}
char top = stack.pop();
if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
return false;
}
}
else if (c == '#') {
break;
}
}
return stack.isEmpty();
}
int main() {
string input;
cin >> input;
if (isMatchingBrackets(input)) {
cout << "匹配" << endl;
}
else {
cout << "不匹配" << endl;
}
return 0;
}
T2
患者到医院看病的顺序是,先排队等候,再看病治疗。要求设计个算法,模拟病人等候就诊的过程。其中:“病人到达"用命令“A”(或"a")表示,"护士让下一位就诊”用"N”(或"n")表示,“不再接收病人排队"用“S”(或“s”)表示,
输入描述
A(或a)病历号
N(或n)
S(或s)
X(其他字符)
输出描述
病历号为x的病人就诊
若队列中有数据,输出队首元素,否则输出“无病人就诊”
不再接收病人排队,并输出当前队列中所有病历号
输入命令不合法!
输入
A
123
n
n
a
124
A
125
X
S
输出
病历号为123的病人就诊
无病人就诊
输入命令不合法!
今天不再接收病人排队,下列排队的病人依次就诊:124 125
#include <iostream>
#include <cstring>
using namespace std;
const int MAX_SIZE = 100;
class PatientQueue {
private:
int data[MAX_SIZE];
int front;
int rear;
public:
PatientQueue() {
front = rear = -1;
}
bool isEmpty() {
return front == -1;
}
bool isFull() {
return (rear + 1) % MAX_SIZE == front;
}
void enqueue(int patientNumber) {
if (isFull()) {
cout << "队列已满,无法加入新病人。" << endl;
return;
}
if (isEmpty()) {
front = rear = 0;
}
else {
rear = (rear + 1) % MAX_SIZE;
}
data[rear] = patientNumber;
}
int dequeue() {
if (isEmpty()) {
cout << "无病人就诊" << endl;
return -1;
}
int patientNumber = data[front];
if (front == rear) {
front = rear = -1;
}
else {
front = (front + 1) % MAX_SIZE;
}
return patientNumber;
}
void printQueue() {
if (isEmpty()) {
cout << "当前队列中无病人。" << endl;
return;
}
cout << "今天不再接收病人排队,下列排队的病人依次就诊:";
int index = front;
while (index != rear) {
cout << data[index] << " ";
index = (index + 1) % MAX_SIZE;
}
cout << data[index] << endl;
}
};
int main() {
PatientQueue queue;
char command;
int patientNumber;
while (true) {
cin >> command;
if (command == 'A' || command == 'a') {
cin >> patientNumber;
queue.enqueue(patientNumber);
}
else if (command == 'N' || command == 'n') {
int patient = queue.dequeue();
if (patient != -1) {
cout << "病历号为" << patient << "的病人就诊" << endl;
}
}
else if (command == 'S' || command == 's') {
queue.printQueue();
break;
}
else {
cout << "输入命令不合法!" << endl;
}
}
return 0;
}
T3
迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径
输入描述
迷宫宽度W 迷宫高度h
迷宫第一行
迷宫第二行
…
迷宫第n行
输出描述
入口横坐标1 入口纵坐标1
横坐标2 纵坐标2
横坐标3 纵坐标3
横坐标4 纵坐标4
横坐标n-1 纵坐标n-1
…
出口横坐标n 出口纵坐标n
输入
8 10
1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1
1 0 1 0 0 1 0 1
1 1 0 3 1 0 1 1
1 0 0 1 0 0 4 1
1 0 0 0 0 1 1 1
1 0 1 0 0 1 0 1
1 0 1 0 0 0 1 1
1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1
输出
3 3
2 3
2 4
2 5
3 5
3 6
3 7
4 7
4 6
4 5
4 4
5 4
6 4
#include <iostream>
#include <list>
using namespace std;
struct PosInfo {
int px, py;
PosInfo(int x, int y) { px = x; py = y; }
};
class MG {
char** S;
int w, h;
int in_x, in_y, out_x, out_y;
list<PosInfo> s;
public:
MG(int w, int h) {
this->w = w;
this->h = h;
this->S = new char* [h];
for (int i = 0; i < h; i++) {
this->S[i] = new char[w];
}
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> S[i][j];
if (S[i][j] == '3') {
in_y = j;
in_x = i;
}
if (S[i][j] == '4') {
out_x = i;
out_y = j;
}
}
}
seekPath(in_x, in_y);
}
bool could(int x, int y)
{
return (S[x][y] != '*' && S[x][y] != '1');
}
bool seekPath(int x, int y) {
s.push_front(PosInfo(y, x));
if (x == out_x && y == out_y) {
if (s.empty()) { cout << "列表为空" << endl; return false; }
while (!s.empty()) {
cout << s.back().px << " " << s.back().py << endl;
s.pop_back();
}
return true;
}
if (could(x, y)) {
S[x][y] = '1';
if (seekPath(x + 1, y)) return true;
if (seekPath(x, y - 1)) return true;
if (seekPath(x - 1, y)) return true;
if (seekPath(x, y + 1)) return true;
}
s.pop_front();
return false;
}
~MG() {
for (int i = 0; i < h; i++) {
delete[] S[i];
}
delete[] S;
}
};
int main() {
int w, h;
cin >> w >> h;
MG m1(w, h);
return 0;
}
T4
设计一个算法找一条从迷宫入口到出口的最短路径
输入描述
迷宫的行和列m n
迷宫的布局
输出描述
最小路径
输入
6 8
0 1 1 1 0 1 1 1
1 0 1 0 1 0 1 0
0 1 0 0 1 1 1 1
0 1 1 1 0 0 1 1
1 0 0 1 1 0 0 0
0 1 1 0 0 1 1 0
输出
(6,8)
(5,7)
(4,6)
(4,5)
(3,4)
(3,3)
(2,2)
(1,1)
#include <iostream>
#include <list>
#include <queue>
#include <vector>
using namespace std;
struct Point {
int x, y;
Point(int x, int y) : x(x), y(y) {}
};
class MG {
int m, n;
int** S;
vector<Point> path;
vector<vector<bool>> visited;
public:
MG(int m, int n) {
this->m = m;
this->n = n;
S = new int* [m];
for (int i = 0; i < m; i++) {
S[i] = new int[n];
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> S[i][j];
}
}
visited.resize(m, vector<bool>(n, false));
searchPath();
printPath();
}
bool could(int x, int y) {
return (x >= 0 && x < m && y >= 0 && y < n && S[x][y] == 0 && !visited[x][y]);
}
void searchPath() {
queue<pair<Point, vector<Point>>> q;
q.push({ Point(0, 0), {Point(0, 0)} });
visited[0][0] = true;
vector<pair<int, int>> directions = {
{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, -1}, {1, 1}, {-1, -1}, {-1, 1}
};
while (!q.empty()) {
auto current = q.front();
q.pop();
Point point = current.first;
vector<Point> currentPath = current.second;
if (point.x == m - 1 && point.y == n - 1) {
path = currentPath;
return;
}
for (auto dir : directions) {
int newX = point.x + dir.first;
int newY = point.y + dir.second;
if (could(newX, newY)) {
visited[newX][newY] = true;
vector<Point> newPath = currentPath;
newPath.push_back(Point(newX, newY));
q.push({ Point(newX, newY), newPath });
}
}
}
}
void printPath() {
for (int i = path.size() - 1; i >= 0; --i) {
cout << "(" << path[i].x + 1 << "," << path[i].y + 1 << ") " << endl;
}
}
~MG() {
for (int i = 0; i < m; i++) {
delete[] S[i];
}
delete[] S;
}
};
int main() {
int m, n;
cin >> m >> n;
MG m1(m, n);
return 0;
}