c - 我的代码在这里有错误吗?C、队列数据结构
问题描述
我正在使用我学校的 LinkedList 解决一个涉及堆栈和队列数据结构的问题。
我已经使用 Queue 解决了这个问题,但它仍然无法工作,我希望从外部查看我的代码,看看哪里出了问题。
我已经写了我的问题,给出了下面的代码和我自己的尝试。
这是一个很长的问题,希望我已经做的足够让你们清楚地帮助我:)
让我知道是否有任何不确定性。
我怀疑这取决于在我搜索整个队列以找到合作伙伴后确定结果。
感谢您帮助一个菜鸟:) 我的判断可能在这一点上模糊不清
我的目标/问题 :编写一个名为balanced()的函数
原型:int平衡(char *表达式);
该函数处理括号并告诉我它是否平衡(返回 0)或不平衡(返回 -1)。
平衡表达式的示例是:
()
([])
{[]}
不平衡表达式的示例是:
{{)]
[({{)])
预期成绩
输入一个以换行符结尾的表达式:
[({{{}}})[[]]{}({})]
表达是平衡的。
输入一个以换行符结尾的表达式:
{1+2+{5}*[6+x]+{4+5}(3+2)}
表达是平衡的。
输入一个以换行符结尾的表达式:
[5[3(3)4{()]}]
表达不平衡。
**下面是我为函数编写和尝试的代码:balanced()。
代码运行,没有错误提示**
int balanced(char *expression)
{
Queue q1, q2;
q1.ll.head = NULL;
q1.ll.tail = NULL;
q1.ll.size = 0;
q2.ll.head = NULL;
q2.ll.tail = NULL;
q2.ll.size = 0;
// transfer all them brackets into a queue called q1
while ( *expression != '0' )
{
if ( *expression != '{' || *expression != '}' || *expression != '[' || *expression != ']' || *expression != '(' || *expression != ')' )
{
enqueue( &q1, *expression );
}
expression++;
}
// at this point, my queue is pure brackets
char interested, partner, partnerSearch;
int innerCount, outerCount, almighty;
innerCount = 0;
outerCount = 0;
almighty = -1;
while ( outerCount != q1.ll.size )
{
if( !isEmptyQueue( &q1 ) )
{
interested = dequeue( &q1 ); // pick a guy
// i'll next try to find a match for the bracket by peekQueue
if ( interested == '{' )
{
partner = '}';
}
else if ( interested == '[' )
{
partner = ']';
}
else if ( interested == '(' )
{
partner = ')';
}
// at this point, they know who their ideal partner is
// I'll need to run it by a loop for the queue
innerCount = 0;
while ( innerCount < (q1.ll.size - 1) )
{
partnerSearch = dequeue( &q1 );
if( partner != partnerSearch )
{
enqueue( &q1, partnerSearch );
}
// so if partner == partnerSearch, it will successfully get dequeue
// if not they queue back
innerCount++;
}
}
else
almighty = 0;
}
if ( almighty == 0 )
return 0;
else
return -1;
}
解决方案
这段代码:
if ( *expression != '{' || *expression != '}' || *expression != '[' || *expression != ']' || *expression != '(' || *expression != ')' )
{
enqueue( &q1, *expression );
}
是错的。
假设这*expression
是一个'a'
. 那么表达式为真。
假设这*expression
是一个'{'
. 那么表达式为真。
假设这*expression
是一个'}'
. 那么表达式为真。
换句话说 - 它永远是真实的。
您可能想使用==
而不是!=
正如@DavidRanieri 在评论中所写:
while ( *expression != '0' )
是错的。
应该是
while ( *expression != '\0' )
或者干脆
while ( *expression )
总的来说,在我看来,您的方法太复杂了。
我会使用堆栈来完成这项工作。所有左括号都被推入堆栈。当你有一个右括号时,从堆栈中弹出并检查两个括号是否具有相同的类型。
这是一些伪代码:
for ( each character C in expression )
{
if (C is an opening bracket)
{
stack->push(C)
}
else if (C is a closing bracket)
{
if (stack is empty) return -1
TMP = stack->pop;
if (C == '}' and TMP != '{') return -1
if (C == ']' and TMP != '[') return -1
... same for other bracket types ...
}
}
if (stack is empty) return 0
return -1
在真正的 C 代码中,这可能是:
int check_brackets(char* expression)
{
stack_t s = {NULL};
char c = *expression++;
while(c)
{
if (c == '{' || c == '[' || c == '(')
{
stack_push(&s, c);
}
else if (c == '}' || c == ']' || c == ')')
{
if (stack_empty(&s)) return -1;
char tmp = stack_pop(&s);
if (
(c == '}' && tmp != '{') ||
(c == ']' && tmp != '[') ||
(c == ')' && tmp != '(')
)
{
stack_free(&s);
return -1;
}
}
c = *expression++;
}
if (stack_empty(&s)) return 0;
stack_free(&s);
return -1;
}
(注意:stack_t 和相关函数的实现未显示)
推荐阅读
- python - 如何从 Django 中的外键模型中获取属性?
- sql - 为什么我的串联不允许我在末尾附加 % ?
- python - 从 android/ios 应用程序到 Windows 软件的实时 JSON 字符串传输
- r - 在 R 中使用带有条件的 sample()
- c# - ALTER TABLE ALTER COLUMN ObjID 失败,因为一个或多个对象访问此列
- .net - 如何在实体框架中将视图检索为 int
- ios - 如果我们在并发队列中导致死锁会发生什么?
- python - Colab 找不到文件
- python - 更改数据集中组的各个列值
- mongodb - 如何查询:数组不包含(不区分大小写)元素