2013-03-15 2 views
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++, и я должен использовать C-строки, а не строки.Я должен использовать функции стека, такие как push, pop, top.Код, как сейчас, будет считать [] правильным и] [неправильным, но помимо этого Он просто рассматривает все входные данные Этот код является тем, что у меня есть до сих пор, любая помощь будет оценена.

+0

Что не работает? Какой вход не дает желаемого выхода? – John3136

ответ

3
expression[0-21]=0; 

Это утверждение буквально означает доступ к позиции -21 массива и его значение равно 0. Это неопределенное поведение, так как позиции массива из 21 элемента варьируются от 0 до 20 (обратите внимание, что 21 является неправильным как -21). 0-21 не является диапазоном , но является арифметической операцией, которая дает одно значение. Если то, что вы хотите инициализации массива, что может быть сделано в определении:

char expression[21] = {}; 

или другими средствами, например, петли или memset (в данном случае, когда тип хранится в массиве является POD)

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 `(`. 

Я понял, давая вам полный код, чтобы скопировать не полезно, так что думать об этом себя более тщательно, хорошо удачи! :)

+0

* laugh * OP почти наверняка делает домашнее задание, и вы только что дали OP полный ответ, который ничего не научит OP. :-) Но да, так вы должны это делать. Кроме того, вы не проверяете, не стекает ли стек во всех закрытых случаях. – Omnifarious

+0

Спасибо, ребята, очень полезно! – user2167980

+0

@ Omnifarious Я этого не осознал и просто вернул свой код :) Я также думаю, что предоставление полного кода здесь не помогает, я предпочитаю давать некоторые подсказки, спасибо за напоминание! –

0

Это простая проблема, которую вы должны решить самостоятельно. Вот алгоритм, чтобы направлять вас, хотя (конечно, я не буду писать код для вас, потому что это было бы совершенно неправильно):

  1. Traverse вход от медианы до конца, на каждом шагу толкающего элемента в стек.
  2. Поперечный ввод с начала на середину, на каждом шаге, выбирая элемент из стека для сравнения с элементом ввода.
  3. Если элемент стека равен "]", а элемент ввода - "[", то продолжайте. Проверьте для каждого из принятых типов разделителей и, если они совпадут в правильном направлении, продолжайте. Если они не соответствуют должным образом, они терпят неудачу. Игнорировать элементы, которые не относятся к допустимым типам разделителей.

Вам нужно немного разобраться здесь, чтобы разобраться с серединой (как рассчитать ее и как иметь дело с четным/нечетным числом элементов и т. Д.). Я рекомендую составить хороший ответ и плохой ответ и сначала проверить алгоритм на бумаге. Удачи!

Смежные вопросы