如何检查给定的两个堆栈在C中是否相等?

时间:2018-11-01 04:54:59

标签: c

我有一个分配问题,我必须检查两个堆栈,看它们是否相等(如果它们包含相同顺序的相同数字)。

我的方法是

- 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);

5 个答案:

答案 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)

一个简单的解决方案是:

  1. 从每个堆栈中弹出一个元素,如果其中一个堆栈为空,则中断。
  2. 比较元素,如果相等,则将它们推入新的堆栈,否则会中断。

重复此操作,直到两个堆栈都为空。如果需要还原堆栈,可以通过弹出新堆栈并在两个堆栈中推送该值来实现。

答案 2 :(得分:1)

您有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。

希望这对您有所帮助。