1.栈在括号匹配中的应用

算法的思想如下:

1)初始设置一个空栈,顺序读入括号。

2)若是右括号,则或者使置于栈顶的最急迫期待得以消解,或者是不合法的情况(括号序列不匹配,退出程序)。

3)若是左括号,则作为一个新的更急迫的期待压入栈中, 自然使原有的在栈中的所有未消解的期待的急迫性降了一级。算法结束时,栈为空,否则括号序列不匹配。

假设一个算术表达式中包含了圆括号,方括号喝花括号3中类型的括号,编写一个算法来判别表达式中的酷哦哦好是否平日对,以字符“\0”作为算术表达式的结束符。



//检测括号
bool BracketsCheck(char* str) {
InitStack(S);
int i = 0;
while (str[i] != '\0') {
switch (str[i]) {
case '(':Push(S, '('); break;
case '[':Push(S, '['); break;
case '{':Push(S, '{'); break;
case ')':Pop(S, e);
if (e != '(') return false;
break;
case ']':Pop(S, e);
if (e != '[') return false;
break;
case '}':Pop(S, e);
if (e != '{') return false;
break;
default: break;
}
i++;
}
if (!IsEmpty(S)) {
cout << "括号不匹配" << endl;
return false;
}
else {
cout << "括号匹配" << endl;
return true;
}
}


2.按铁道进行车厢调度(注意,两侧铁道均为单向行驶道,火车调度站有一个月于调度的“栈道”),火车调度站的入口处有n节硬座和软座车厢(分别用H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列以使所有的软座车厢都被调整到硬座车厢之前。



void Train_Arrange(char* train) {
char* p = train, * q = train, c;
stack s;
InitStack(s);
while (*p) {
if (*p == 'H')
Push(s, *p);
else
*(q++) = *p;
p++;
}
while (!StackEmpty(s)) {
Pop(s, c);
*(q++) = c;
}
}


4.某汽车轮渡口,过江渡船每次能载10辆车过江。过江车辆分为客车类和货车类,上渡船有如下规定:同类车先到先上船;客车先于货车上船,且每上4辆客车,才允许放上1辆货车;若等待客车不足4辆,则以货车代替;若无货车等待,允许客车都上船。试设计一个算法模拟渡口管理。



Queue q;  //过江渡船队列
Queue q1; // 客车队列
Queue q2; //货车队列
void manager() {
int i = 0, j = 0;
while (j < 10) {
if (!QueueEmpty(q1) && i < 4) {
DeQueue(q1, x);
EnQueue(q, x);
i++;
j++;
}
else(i == 4 && !QueueEmpty(q2)) {
DeQueue(q2, x);
EnQueue(q, x);
i = 0;
j++;
}
else { //客车队列为空
while (j < 10 && i < 4 && !QueueEmpty(q2)) {
DeQueue(q2, x);
EnQueue(q, x);
i++;
j++;
}
i = 0;
}
if (QueueEmpty(q1) && QueueEmpty(q2)) { //加起来不足10辆,提前结束循环
j = 12;
}
}
}