回 帖 发 新 帖 刷新版面

主题:程序通过,得不出结果,大家帮忙看一下吧

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
 int *top;
 int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
 else return 0;
}
Status GetTop(SqStack s,char e)
{//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
    if(s.top==s.base) return ERROR;
    e=*(s.top-1);
    return(e);
}
Status mathing()
{char c[100],ch1,ch2,e; int i; SqStack s;
printf("请输入包括括号的表达式:");
scanf("%s",c);
i=0;
while(ch1=c[i++])
{switch (ch1)
{case '[':
 case '(': push(s,ch1);break;
 case ']': if(StackEmpty(s)) {printf("不匹配,右括号多了!"); return ERROR;} 
           GetTop(s,ch2);
           if(ch2=='[') pop(s,e);
           else { printf("左右括号不匹配!"); return ERROR;} break;
 case ')':if(StackEmpty(s)) {printf("不匹配,右括号多了!"); return ERROR;} 
           GetTop(s,ch2);
           if(ch2=='(') pop(s,e);
           else{ printf("左右括号不匹配!"); return ERROR;} break;}
}
if(!StackEmpty(s)) {printf("不匹配,左括号多了!");return ERROR;}
printf("括号匹配");return OK;
}
main()

mathing();
printf("\n");
 
}
调试通过了,但得不出正确的结果不知什么原因?大家帮忙看一下

回复列表 (共4个回复)

沙发

Status GetTop(SqStack s,char &e)  // e要么为引用,要么为指针变量
{//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
    if(s.top==s.base) return ERROR;
    e=*(s.top-1);
    return(e);
}

Status mathing()
{
    char c[100],ch1,ch2,e; int i; SqStack s;
    printf("请输入包括括号的表达式:");
    scanf("%s",c);
    i=0;
    InitStack(s);    /// 必须初始化
    while(ch1=c[i++])
    {
        switch (ch1)
        {
        case '[':
         case '(': 
             push(s,ch1);break;
         case ']': 
             if(StackEmpty(s)) 
             {
                 printf("不匹配,右中括号多了!"); 
                 return ERROR;
             } 
             GetTop(s,ch2);
             if(ch2=='[') 
                 pop(s,e);
             else 
             { 
                 printf("缺少左中括号!"); 
                 return ERROR;
             } 
             break;
         case ')':
             if(StackEmpty(s)) 
             {
                 printf("不匹配,右小括号多了!"); 
                 return ERROR;
             } 
             GetTop(s,ch2);
             if(ch2=='(') 
                 pop(s,e);
             else
             { 
                 printf("缺少左小括号!"); 
                 return ERROR;
             } 
             break;}
    }
    if(!StackEmpty(s)) 
    {
        printf("不匹配,左括号多了!");
        return ERROR;
    }
    printf("括号匹配");
    return OK;
}

板凳

#include<iostream.h>
#include<stack>
using namespace std;
void main()
{
    stack<double>openings;
    char symbol;
    bool is_matched=true;
    while(is_matched&&(symbol=cin.get ())!='\n'){
    if(symbol=='{'||symbol=='('||symbol=='[')
        openings.push (symbol);
    if(symbol=='}'||symbol==')'||symbol==']'){
        if(openings.empty ()){
        cout<<"unmatched closing bracket"<<symbol<<"detected."<<endl;
        is_matched=false;

        }
        else{
            char match;
            openings.top();
            is_matched=(symbol=='}'&&match=='{')||(symbol==')'&&match=='(')||(symbol==']'&&match=='[');
            if(!is_matched)
                cout<<"bad match"<<match<<symbol<<endl;
            }
        }
    }
    if(!openings.empty ())
        cout<<"unmatched opening bracket(s) detected."<<endl;
}

3 楼

#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{int *base;
 int *top;
 int stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{if(s.base==s.top) return 1;
 else return 0;
}
Status GetTop(SqStack s,char &e)
{//若栈不空,则用e返回s的栈顶元素,并返回OK,否则返回ERROR
    if(s.top==s.base) return ERROR;
    e=*(s.top-1);
    return(e);
}
void matching()
{int state=1;char c,e; SqStack s;
 InitStack(s);
 printf("请输入包括括号的表达式:");
 while(state && (c=getchar())!='\n')
 {switch(c)
 {case'[':
  case'(': push(s,c); break;
  case')': if(!StackEmpty(s)&& GetTop(s,e)=='(') pop(s,e);
            else state=0; break;
  case ']':if(!StackEmpty(s)&& GetTop(s,e)=='[') pop(s,e);
            else state=0; break;

 }//switch
 }//while
 if(StackEmpty(s) && state)  printf("括号匹配!");
 else printf("括号不匹配");
 printf("\n");

}
main()
{matching();
}
把我调试出来的另一算法发给大家,请多指教

4 楼

#include <iostream.h>
#include <conio.h>
#include <string.h>
void main()

{
    char str[20];
    char stack[20];
    char* p=stack;
    int i=0;
    bool Match=true;
    cout<<"Input: "<<endl;
    cin>>str;
    cout<<str<<endl;
    for(i=0;i<strlen(str)&&Match;i++)
    {
        switch(str[i]){
        case '(':
        case '[':
            *p++=str[i];
            break;
        case ')':
            if(*--p!='(')
            {
                cout<<"Not Match"<<endl;
                Match=false;
            }
            break;
        case ']':

            if(*--p!='[')
            {
                cout<<"Not Match"<<endl;
                Match=false;
            }
            break;
        default:
            cout<<"Input Error!"<<endl;
            break;
        }
    }
    if(Match)
        cout<<"Match"<<endl;
    getche();
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册