【发布时间】:2018-04-28 12:33:26
【问题描述】:
我正在尝试创建一个程序来评估一堆括号以确保它们的正确实现(即,如果括号具有开始和结束组件,则括号有效,因此它返回“true”)。例如 [()]{}{()()} 为真,而 [({}) 为假。
目前,我即将完成程序,但堆栈评估的逻辑运算符不能正常工作。
我在 Xcode 中编程,问题可能与 IDE 相关,但不太可能。问题:线程 1:EXC_BAD_ACCESS (code=1, address=0x0)
程序不完整。我将插入一串括号作为输入,并使用递归来评估堆栈,以便删除堆栈中的所有元素,如果括号逻辑正确,在这种情况下(“[() ]{}{()()}“) 是正确的。所需的逻辑如下:
s.evaluate -> []{[]}
s.evaluate -> {}
s.evaluate -> 真
#include<iostream>
using namespace std;
struct node
{
char bracket;
node* next;
};
class stack
{
node* top;
public:
// constructure
stack()
{
top = NULL;
}
void push(char bracket); // to insert an element
void pop(); // to delete an element
void evaluate(); // to evaluate the stack for brackets' logic
void show(); // to show the stack
bool isPair(node* n2, node* n1) {
if ((n1->bracket == '(' && n2->bracket == ')') || (n1->bracket == '[' && n2->bracket == ']') || (n1->bracket == '{' && n2->bracket == '}')) {
return true;
} else {
return false;
}
}
};
// insert an element
void stack::push(char bracket)
{
char value = bracket;
node* ptr;
ptr = new node;
ptr->bracket = value;
ptr->next = NULL;
if (top != NULL)
ptr->next = top;
top = ptr;
}
// delete an element
void stack::pop()
{
node* temp;
if (top == NULL)
{
cout << "\nThe stack is empty.";
}
temp = top;
top = top->next;
cout << "\nPOP Operation" << endl << "Poped value is " << temp->bracket;
delete temp;
}
// evaluate a stack for bracket logic
void stack::evaluate()
{
node* target = top;
node* targetNext = target->next;
node* temp;
node* tempNext;
if (target == NULL)
{
cout << "\nTrue" << endl;
}
while (target != NULL)
{
if (isPair(targetNext, target)) {
temp = targetNext->next;
tempNext = temp->next;
cout << target->bracket << " and " << targetNext->bracket << " are deleted" << endl;
delete target;
delete targetNext;
target = temp;
targetNext = tempNext;
} else {
target = target->next;
targetNext = target->next;
}
}
}
// Show stack
void stack::show()
{
node* ptr1 = top;
cout<<"\nThe stack is\n";
while(ptr1 != NULL)
{
cout << ptr1->bracket << " -> ";
ptr1 = ptr1->next;
}
cout << "NULL\n";
}
// Main function
int main()
{
stack s1;
string brackets = "[()]{}{[()()]()}";
for(char& c : brackets) {
s1.push(c);
}
s1.show();
s1.evaluate();
s1.show();
return 0;
}
现在,我专注于 if 逻辑部分。我已将符号更改为:
bool isPair(node* n2, node* n1) {
if ((n1->bracket == '(' && n2->bracket == ')') || (n1->bracket == '[' && n2->bracket == ']') || (n1->bracket == '{' && n2->bracket == '}')) {
return true;
} else {
return false;
}
}
到:
bool isPair(node* n2, node* n1) {
if (n1->bracket == '(' && n2->bracket == ')')
{
return true;
}
else if (n1->bracket == '[' && n2->bracket == ']')
{
return true;
}
else if (n1->bracket == '{' && n2->bracket == '}')
{
return true;
}
else
{
return false;
}
}
但它并没有改变任何东西(正如预期的那样)。为什么 Xcode 不想完全处理我的代码?
当前输出为:
The stack is
} -> ) -> ( -> ] -> ) -> ( -> ) -> ( -> [ -> { -> } -> { -> ] -> ) -> ( -> [ -> NULL
( and ) are deleted
{ and } are deleted
(lldb)
我知道,代码很菜鸟,我是 C++ 和数据结构的新手,不过,非常感谢您的帮助! ????
【问题讨论】:
-
你的问题可能与获取空字符串的字符有关,看看stackoverflow.com/questions/19239566/…它可以帮助你。
-
确实,我应该检查一下 targetNext 是否存在。
-
这与您的问题无关,但由于您是新手:您可能想要创建一个析构函数或查看现代指针类型(unique_ptr、shared_ptr)。此代码当前会造成内存泄漏,因为您在堆上创建了
nodes,但如果删除了stack,则永远不要删除它们。 -
@JeromeReinländer,这是我现在遇到的问题。程序永不停止。谢谢你的建议!顺便问一下,你能为这个问题写一个简单的析构函数吗? ??????
-
你是对的,你检查目标不是 NULL,但不是那个 target->next(又名 targetNext)不是 NULL...
标签: c++ data-structures linked-list stack