试图编写一个c ++堆栈程序

时间:2013-03-15 03:54:37

标签: c++ visual-c++ stack

#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这样的堆栈函数。现在的代码将考虑[]正确和] [不正确,但除此之外它只考虑所有输入正确。这个代码是我到目前为止,任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

expression[0-21]=0;

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

char expression[21] = {};

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

答案 1 :(得分: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 `(`.

我意识到给你完整的代码复制是没有用的,所以自己想一想,祝你好运! :)

答案 2 :(得分:0)

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

  1. 从中点到终点的遍历输入,每一步都将元素推入堆栈。
  2. 从开始到中点遍历输入,在每一步,从堆栈弹出一个元素以与输入元素进行比较。
  3. 如果stack元素为“]”,输入元素为“[”,则继续。检查每个接受的分隔符类型,如果它们在正确的方向上匹配,则继续。如果它们不匹配则失败。忽略不属于接受的分隔符类型的元素。
  4. 你需要在这里找出一点来处理中点(如何计算它,以及如何处理偶数/奇数个元素等)。我建议先写一个好的答案和一个错误的答案并在纸上测试算法。祝你好运!