0
#include "cstack.h"
#include <iostream>
#include <cstring>
using namespace std;

bool isValidExpression (CStack&, char*);

int main (void)
{
   char expression[21];
   expression[0-21]=0;
   cout<< "Enter an expression: ";
   cin >>expression;
   CStack stack1;

   if (isValidExpression (stack1, expression)==true)
   {
      cout << "\nIt's a valid expression";
   }
   else
   {
      cout << "\nIt's NOT a valid expression";
   }
   return 0;
}

bool isValidExpression (CStack& stackA, char* strExp)
{


   for(int a=0;a<21 && strExp[a]!=0;a++)
   {
      cout<<"Action A" <<endl;
      stackA.push(strExp[a]);
   }
   /*if(strExp[a]=='}'||strExp[a]==']'||strExp[a]==')')
     {

     }
     else*/

   if(strExp[stackA.Top()]=='['||strExp[stackA.Top()]=='{'||strExp[stackA.Top()]=='(')
   {
      return false;
   }

   for(int a=stackA.Top();a>0;a--)
   {
      if(strExp[a]=='['||strExp[a]=='{'||strExp[a]=='(')
      {
         stackA.pop();
      }
      else if(strExp[a]==']')
      {
         for(int g=stackA.Top();g>0;g--)
         {
            if(strExp[a-1]=='[' && strExp[a-1]!=0)
            {
               stackA.pop();
               g--;
               break;
            }
            else if(strExp[a-1]==0)
            {
               return false;
            }
         }
      }
      else if(strExp[a]=='}')
      {
         for(int g=stackA.Top();g>0;g--)
         {
            if(strExp[a-1]=='{' && strExp[a-1]!=0)
            {
               stackA.pop();
               break;
            }
            else if(strExp[a-1]==0)
            {
               return false;
            }
         }
      }
      else if(strExp[a]==')')
      {
         for(int g=stackA.Top();g>0;g--)
         {
            if(strExp[a-1]=='(' && strExp[a-1]!=0)
            {
               stackA.pop();
               break;
            }
            else if(strExp[a-1]==0)
            {
               return false;
            }
         }
      }
   }
   return true;
}

我在这个程序中要做的是输入一个由以下字符组成的语句:]、}、)、[、{、(。所有字符都像这样相互靠近的语句 ([])会是真的。(][) 不会是真的。[] 会是真的。[(]){{ 不会是真的。

这个程序是用 C++ 编写的,我必须使用 C 字符串而不是字符串。我必须使用诸如 push、pop、top 之类的堆栈函数。现在的代码将认为 [] 正确和 ][ 不正确,但除此之外它只认为所有输入都是正确的。这段代码是我到目前为止所拥有的,任何帮助将不胜感激。

4

3 回答 3

3
expression[0-21]=0;

该语句的字面意思是访问数组的位置 -21 并将其设置为 0。这是未定义的行为,因为 21 个元素的数组的位置范围从 0 到 20(注意,21 与 -21 一样错误)。0-21不是范围,而是产生单个值的算术运算。如果您想要的是数组的初始化,可以在定义中完成:

char expression[21] = {};

或通过其他方式,如循环或memset(在这种情况下,存储在数组中的类型是 POD)

于 2013-03-15T04:02:26.083 回答
1

我认为您使问题变得比需要的更复杂,有关实施的提示:

1. You shouldn't use `stack` as an input for the testing function, 
    that makes no sense, just use it locally.
2. You can scan over the whole expression and push some characters,
   if meet another characters, just check if the stack content meets the requirements,
   if not, invalid expression, say `1+(2*3)`, when `)` is met, we should just found
   a corresponding `(`.

我意识到给你完整的代码来复制是没有帮助的,所以自己更彻底地考虑一下,祝你好运!:)

于 2013-03-15T04:12:05.667 回答
0

这是一个简单的问题,您应该能够自己解决。这里有一个算法来指导你(当然我不会为你写代码,因为那是完全错误的):

  1. 从中点到结束遍历输入,在每一步将一个元素压入堆栈。
  2. 从开始到中点遍历输入,在每一步中,从堆栈中弹出一个元素以与输入元素进行比较。
  3. 如果堆栈元素是“]”并且输入元素是“[”,则继续。检查每个接受的分隔符类型,如果它们在正确的方向上匹配,则继续。如果它们不正确匹配,则失败。忽略不属于可接受的分隔符类型的元素。

您需要在这里弄清楚一点来处理中点(如何计算它,以及如何处理偶数/奇数个元素等)。我建议编一个好答案和一个坏答案,然后先在纸上测试算法。祝你好运!

于 2013-03-15T04:22:08.730 回答