


试卷1:
一、算法设计题
1.已知Q是一个非空队列,S是一个空栈。使用Pascal或C语言编写一个算法,仅用队列和栈的ADT函数和少量工作变量,将队列Q中所有元素逆置。

顺序取出队元素,入栈;所有元素入栈后,再从栈中逐个取出,入队。算法如下:
cpp
reverse_queue(queue q.stack s){
//用栈s逆置队列q
while !isempty(q){//取所有队列元素入栈 只要队列不为空就出队入栈
data=dequeue(q);
push(s,data);
}//while
while !isempty(s){//取所有栈元素入队 只要栈不为空就继续出站入队
data=pop(s);
enqueue(q.data);
}//while
}//reverse_queue
2.
cpp
unsigned char isBalanced(char * string) {
int i = 0;
char c;
while (string[i] != '\0') {
char ch = string[i]; // 获取当前字符
// 1. 如果是左括号,直接压栈
if (ch == '(' || ch == '[' || ch == '{') {
push(ch);
}
// 2. 如果是右括号,需要检查匹配情况
else if (ch == ')' || ch == ']' || ch == '}') {
// 如果栈为空却来了右括号,说明不平衡
if (isempty()) return 0;
c = pop();
// 检查弹出的左括号是否与当前右括号匹配
if ((ch == ')' && c != '(') ||
(ch == ']' && c != '[') ||
(ch == '}' && c != '{')) {
return 0;
}
}
i++; // 记得移动到下一个字符,否则会死循环哦!
}
// 3. 最后检查:如果字符串遍历完了,栈里还有多余的左括号,也是不平衡
return isempty() ? 1 : 0;
}