qw30716 发表于 2014-4-20 19:33:54

利用栈检验算术表达式中括号是否配对,输入错误的表达式时输出是正确的

请帮忙看下哪里有问题
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define StackSize 100
typedef char DataType;
typedef struct
{        DataType data;
        int top;
}SeqStack;

void main()
{
        SeqStack S;
        char exp;
        char ch;
        bool status;
        int i;
        void InitStack(SeqStack *S);                                                               
        bool StackEmpty(SeqStack S);
        void Push(SeqStack *S, DataType newelem);
        DataType Pop(SeqStack *S);
        void PrintStack(SeqStack S);
        cout<<"输入要检验括号匹配的表达式:"<<endl;
        cin>>exp;
        InitStack(&S);
        status=true;
        i=0;
        ch=exp;
        i++;
        while ((ch!='\0') && status)        //回车换行符
        {
                switch (ch)
                {
                case '(':
               
                        Push(&S,ch);
                        break;
                case ')':
                        if (Pop(&S)!='(')
                                status=false;
                        break;
               
               
                }
                ch=exp;
                i++;
        }
        if (StackEmpty(S) && status)
                cout<<"表达式正确!"<<endl;
        else
        {
                cout<<"表达式不正确!"<<endl;
                cout<<"第"<<i<<"字符开始不正确!"<<endl;
        }
        system("pause");
}
void InitStack(SeqStack *S)
{
        S->top=-1;
}
bool StackEmpty(SeqStack S)
{
        if (S.top==-1)
                return true;
        else
                return false;
}
void Push(SeqStack *S, DataType newelem)
{
        S->top++;
        S->data=newelem;
}
DataType Pop(SeqStack *S)
{
        S->top--;
        return S->data;
}

415418014 发表于 2014-4-20 19:33:55

qw30716 发表于 2014-4-20 22:52 static/image/common/back.gif
#include
#include
#include


为什么要用链栈?徒增麻烦
既然用了链栈为什么直接将指针++(->next)
用链栈得用双向吧。不然怎么POP(除非从头索引,找到next的下一个为top的位置)
还有就是没申请空间你怎么入栈
我感觉连基本的栈操作都是不对的。还没看main

青玄 发表于 2014-4-20 21:17:42

这个程序编译没问题啊!

qw30716 发表于 2014-4-20 22:50:41

青玄 发表于 2014-4-20 21:17 static/image/common/back.gif
这个程序编译没问题啊!

我发错了程序,不是这个

qw30716 发表于 2014-4-20 22:52:36

青玄 发表于 2014-4-20 21:17 static/image/common/back.gif
这个程序编译没问题啊!

#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include <iostream>
using namespace std;
typedef struct Node
{        int data;
struct Node *next;

}NODE , *PNODE;
typedef struct Stack
{
        PNODE ptop;
        PNODE pbottom;

}STACK,*PSTACK;
void InitStack(PSTACKPS);                                                               
        bool StackEmpty(PSTACKPS);
        void Push(PSTACKPS, char newelem);
        char Pop(PSTACKPS);
        void PrintStack(STACKS);
void main()
{
        STACKS;
        char exp;
        char ch;
        bool status;
        int i;
       
        cout<<"输入要检验括号匹配的表达式:"<<endl;
        cin>>exp;
        InitStack(&S);
        status=true;
        i=0;
        ch=exp;
        i++;
        while ((ch!='\0') && status)        //回车换行符
        {
                switch (ch)
                {
                case '(':
               
                        Push(&S,ch);
                        break;
                case ')':
                        if (Pop(&S)!='(')
                                status=false;
                        break;
               
               
                }
                ch=exp;
                i++;
        }
        if (StackEmpty(&S) && status)
                cout<<"表达式正确!"<<endl;
        else
        {
                cout<<"表达式不正确!"<<endl;
                cout<<"第"<<i<<"字符开始不正确!"<<endl;
        }
        system("pause");
}
void InitStack(PSTACKS)
{
        S->ptop=NULL;
}
bool StackEmpty(PSTACKS)
{
        if (S->ptop==NULL)
                return true;
        else
                return false;
}
void Push(PSTACKS, char newelem)
{
        S->ptop++;
        S->ptop->data=newelem;
}
char Pop(PSTACKS)
{
        S->ptop--;
        return S->pbottom;
}
页: [1]
查看完整版本: 利用栈检验算术表达式中括号是否配对,输入错误的表达式时输出是正确的