我有一个分配问题,我必须检查两个堆栈,看它们是否相等(如果它们包含相同顺序的相同数字)。
我的方法是
- Find the size of the stacks
- If (size of stack 1 > size of stack 2 || size of stack 1 < size of stack 2)
- Tell the user it doesn't equal
- Set a to size of [n[ where en is the size of each stack, and pop all the elements of stack 1 to array1 and do the same for stack 2, but assign to stack2.
- then using a for loop check if a[I] = b[I]
我们只是被告知
您不能对如何实现堆栈进行假设。 如果要使用任何其他功能,则需要实现它。
typedef struct {
... // not known
} stack_t;
// creates a new stack
stack_t* stack_create();
// pushes a given item to the stack
void stack_push(stack_t* s, int item);
// pops the top element from the stack //
int stack_pop(stack_t* s);
// checks if the stack is empty
bool stack_is_empty(stack_t* s);
// frees the stack
void stack_free(stack_t* s);
答案 0 :(得分:4)
在O(n)中,不计算堆栈的大小,请注意堆栈为空而不是另一个堆栈的特殊情况。
(提示算法)之类的
bool are_equal(stack1, stack2) {
while ( 1 ) {
bool e1 = is_empty(stack1);
bool e2 = is_empty(stack2);
if (e1 && e2) return true; // equal
if (e1 || e2) return false; // not equal
if (pop(stack1) != pop(stack2)) return false; // not equal
}
}
答案 1 :(得分:2)
一个简单的解决方案是:
重复此操作,直到两个堆栈都为空。如果需要还原堆栈,可以通过弹出新堆栈并在两个堆栈中推送该值来实现。
答案 2 :(得分:1)
您有2个选择。
答案 3 :(得分:1)
这是一个松散编写的伪代码,假设如果给定的堆栈为空,则stack_is_empty
返回true
bool are_they_equal( stack_t *s1, stack_t *s2 )
{
/* if both are not empty keep popping from both until
either one of them is empty or both empty */
while( !stack_is_empty(s1) && !stack_is_empty(s2) )
{
/** Problem with Ordering , return **/
if( stack_pop(s1) != stack_pop(s2) ) {
return false;
}
}
/* if both empty they've popped equal number of elements ( equal )
otherwise no*/
return (stack_is_empty(s1) && stack_is_empty(s2)) ? true : false;
}
答案 4 :(得分:1)
我认为有很多方法可以实现您的目标。但是,到目前为止,我能想到的最简单的方法是基于@ahota给出的想法。 我无法为您编写完整的代码,但我在解释以下方法。如果您需要更多信息,请写信给我。
Step1:使用is_empty()检查两个堆栈是否都是纯净的。 如果两个堆栈都为空,则它们相同;否则,如果任何堆栈为空,则它们不相同。退出程序。
Step2:如果两个堆栈都不为空,则从两个堆栈中弹出元素,例如a = pop(stack1)b = pop(stack2)。
Step3:比较a和b。如果a和b不相同,则stack1和stack2不相同。在此处退出程序。如果a和b相同,则重复步骤1-3。
希望这对您有所帮助。