c指针问题

makaiElgert 2017-03-21 01:48:54
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
//栈的顺序存储表示
Status InitStack(Sqstack *L)
{
//构造一个空栈
(*L).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!(*L).base) exit(ERROR);
(*L).top = (*L).base;
(*L).stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
//销毁栈
Status DestroyStack(Sqstack *L)
{
if((*L).top == (*L).base) return ERROR;
free((*L).base);
/*
调用malloc函数时,系统会自动记住该空间的起始地址及大小,
释放free时只需要将起始空间告诉系统
*/
(*L).base = NULL;
return 0;
}
//清空栈
Status ClearStack(Sqstack *L)
{
(*L).top = (*L).base;
return 0;
}
//判断栈是否为空
Status IsEmpty(Sqstack *L)
{
if((*L).top == (*L).base)
return TRUE;
else
return FALSE;
}
//返回栈的长度
Status StackLength(Sqstack *L)
{

if((*L).top != (*L).base)
return (*L).top - (*L).base;
}
//用e返回栈顶元素
Status GetTop(Sqstack *L,SElemType *e)
{
if((*L).top != (*L).base)
*e = *((*L).top - 1);
return 0;
}
//插入元素为e的新元素
Status Push(Sqstack *L,SElemType e)
{
if((*L).top - (*L).base >= (*L).stacksize)
{
(*L).base = (int *)realloc((*L).base, ((*L).stacksize + STACKINCREMENT) * sizeof(int));
if(!(*L).base)
return ERROR;
(*L).stacksize += STACKINCREMENT;
}
*((*L).top) = e;
(*L).top++;
return 0;
}
//
Status Pop(Sqstack *L,SElemType *e)
{
if((*L).top == (*L).base)
return ERROR;
*e = *(--(*L).top);
return OK;
}
//遍历栈中的元素
Status StackTravers(Sqstack *L,void(* vi)(SElemType))
{
if((*L).top == (*L).base)
return ERROR;
while((*L).top > (*L).base)
{
vi(*(*L).base);
(*L).base++;
}
return 0;
}
//算法3.1数制转换
void conversion()
{
Sqstack s;
int mod,n,e;
InitStack(&s);//初始化栈
scanf("%d",&n);//等待用户输入
//printf("%d",n);
while(n)//进行8进制的转换
{
mod = n % 8;
n = n/ 8;
Push(&s,mod);
}
while(!IsEmpty(&s))//输出结果
{
Pop(&s,&e);
printf("%d\n",e);
}
printf("\n");
}
//算法3.2.2括号匹配检验
Status check()
{
Sqstack s;
char ch[80],*p,e,g;

if(InitStack(&s))//初始化栈成功
{
printf("请输入一个表达式:\n");
gets(ch);
p = ch;
while(*p)//没有到串尾

switch(*p)
{
case '(':
case '[':
Push(&s,*p++);
break;//左括号入栈,且p++
case ')':
case ']':
printf("%c\n",*p);
printf("1\n");
if(!IsEmpty(&s))//栈不空
{
Pop(&s,&e);//弹出栈顶元素
printf("%c\n",e);
printf("%c\n",*p);
if(*p== ')'&& e!='('||*p== ']'&& e!= '[')//弹出的栈顶元素与括号不匹配,此处判别式有问题
{
printf("左右括号不匹配\n");
exit(ERROR);
}
else
{
p++;
break;
}
} else
{
printf("缺乏左括号\n");
exit(ERROR);
}

default: p++;//其他字符不处理,指针后移
}
}
if(IsEmpty(&s))//字符串结束时栈空
printf("括号匹配\n");
else
printf("右括号不匹配\n");
}


int main()
{
check();
return 0;
}

在控制台输入字符'(]',程序显示‘括号匹配’.在进行调试的时候发现当*p = ']'时,程序会进入case ']'后的语句,这时*p依然是']',但是经过Pop(&s,&e);后,*p就变为空,*p = '';无法进入if的条件判断,请问这是为什么?
...全文
116 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-03-21
  • 打赏
  • 举报
回复
应该是这个case ')': case ']':少了一个break;
#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 32
#define STACKINCREMENT 10

#define TRUE 1
#define FALSE 0

typedef char SElemType;
typedef struct node {
    SElemType *base;
    SElemType *top;
    int stacksize;
}Sqstack;

typedef enum ret {
    ERROR = -1,
       OK = 0,
}Status;

//栈的顺序存储表示
Status InitStack(Sqstack *L)
{
    //构造一个空栈
    (*L).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!(*L).base)
        exit(ERROR);
    (*L).top = (*L).base;
    (*L).stacksize = STACK_INIT_SIZE;

    return OK;
}
Status DestroyStack(Sqstack *L)
{
    if((*L).top == (*L).base)
        return ERROR;
    free((*L).base);
    (*L).base = NULL;
    return OK;
}
//清空栈
Status ClearStack(Sqstack *L)
{
    (*L).top = (*L).base;
    return OK;
}
//判断栈是否为空
int IsEmpty(Sqstack *L)
{
    if((*L).top == (*L).base)
        return TRUE;
    else
        return FALSE;
}

int StackLength(Sqstack *L)
{

    if((*L).top != (*L).base)
        return  (*L).top - (*L).base;
    else
        return 0;
}

Status GetTop(Sqstack *L,SElemType *e)
{
    if((*L).top != (*L).base)
        *e = *((*L).top - 1);
    return OK;
}
//插入元素为e的新元素
Status Push(Sqstack *L,SElemType e)
{
    if((*L).top - (*L).base >= (*L).stacksize)
    {
        (*L).base = (char *)realloc((*L).base, ((*L).stacksize + STACKINCREMENT) * sizeof(char));
        if(!(*L).base)
            return ERROR;
        (*L).stacksize += STACKINCREMENT;
    }
    *((*L).top) = e;
    (*L).top++;

    return OK;
}

Status Pop(Sqstack *L,SElemType *e)
{
    if (!IsEmpty(L))
        *e = *(--L->top);
    return OK;
}
//遍历栈中的元素
Status StackTravers(Sqstack *L, void(* vi)(SElemType))
{
    if((*L).top == (*L).base)
        return ERROR;
    while((*L).top > (*L).base)
    {
        vi(*(*L).base);
        (*L).base++;
    }
    return 0;
}
#if 0
//算法3.1数制转换
void conversion()
{
    Sqstack s;
    int mod,n,e;
    InitStack(&s);//初始化栈
    scanf("%d",&n);//等待用户输入
    //printf("%d",n);
    while(n)//进行8进制的转换
    {
        mod = n % 8;
        n =  n/ 8;
        Push(&s,mod);
    }
    while(!IsEmpty(&s))//输出结果
    {
        Pop(&s,&e);
        printf("%d\n",e);
    }
    printf("\n");
}
#endif
//算法3.2.2括号匹配检验
Status check()
{
    Sqstack s;
    char ch[80], *p, e;

    if(!InitStack(&s))//初始化栈成功
    {
        printf("请输入一个表达式:\n");
        fgets(ch, 80, stdin);
        p = ch;
        while (*p)//没有到串尾

            switch(*p) {
                case '(':
                case '[':
                    Push(&s,*p++);
                    break;

                case ')':
                case ']':
                    if(!IsEmpty(&s)) {
                        Pop(&s,&e);
                        if((*p == ')' && e!='(')|| (*p== ']'&& e!= '[')) {
                            printf("左右括号不匹配\n");
                            exit(ERROR);
                        } else {
                            p++;
                            break;
                        }
                    } else {
                        printf("缺乏左括号\n");
                        exit(ERROR);
                    }
                    break;

                default:
                    p++;
            }
    }
    if(IsEmpty(&s))//字符串结束时栈空
        printf("括号匹配\n");
    else
        printf("右括号不匹配\n");
    return OK;
}


int main()
{
    check();
    return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧