这是什么神奇的错误,59行代码没问题,60行没有代码,61行直接变量自动变成0了。无论改成什么第60行他铁定变成0,这什么鬼操作啊。右边是gdb调试的图片,左边是代码,问题就在60行这里。

img


这是什么神奇的错误,59行代码没问题,60行没有代码,61行直接变量自动变成0了。无论改成什么第60行他铁定变成0,这什么鬼操作啊。右边是gdb调试的图片,左边是代码,问题就在60行这里。

迷惑
贴一下源代码我调一下试试?

大概改了一下,你用temp同步栈顶元素写的有问题,strcpy的时候把t也覆盖了
同步char直接用等号赋值就行
我改了一下现应该是能跑了
有帮助望采纳


// 链栈的实现
// #include"h_Public.h"
#include <iostream>
#include <cstring>
using namespace std;
#define Maxsize 100

typedef struct
{
    char Data;
} ElemType;
typedef struct Lnode
{
    ElemType Data;
    struct Lnode *Pnext;
} Snode, *PSnode;

int PushStack(PSnode SS, ElemType *ee);
void PrintfSnode(PSnode SS);
int IsEmpty(PSnode SS);
void DestroySnode(PSnode SS);
int ClearSnode(PSnode SS);
PSnode InitialSnode();
int PopStack(PSnode SS, ElemType *ee);
int IsComper(PSnode SS, char data[Maxsize]);
int PFStack(PSnode SS, char *ee);
/////////////////////////////////
int main()
{
    PSnode SS = InitialSnode();
    char data[Maxsize];
    memset(data, 0, sizeof(data));
    printf("请输出你的括号:");
    scanf("%s", data);
    char tt = data[0];
    printf("%c\n", tt);
    int aa = 0;
    if (tt == '(')
        aa = 1;
    printf("%d\n", aa);
    IsComper(SS, data);

    return 1;
}
//////////////////////////////////
//括号匹配函数
int IsComper(PSnode SS, char data[Maxsize])
{
    if ((SS == NULL))
    {
        printf("传参出错\n");
        return 0;
    }
    int L = strlen(data);
    char t = 0;
    char temp = 0;
    ElemType T;
    for (int aa = 0; aa < L; aa++)
    {
        t = data[aa];
        if ((t == '(') || (t == '[') || (t == '{'))
        {
            T.Data = t;
            PushStack(SS, &T);
        }
        if (t == ')' || t == '}' || t == ']')
        {
            if (IsEmpty(SS) == 1)
            {
                printf("匹配失败\n");
                return 0;
            }
            PFStack(SS,&temp);
            printf("%c==\n", t);
            if ((t == ')' && temp == '(') || (t == ']' && temp == '[') || (t == '}' && temp == '{'))
            {
                ElemType e;
                PopStack(SS, &e);
            }
        }
    }
    if (IsEmpty(SS) == 1)
    {
        printf("匹配成功\n");
        return 1;
    }
    if (IsEmpty(SS) == 0)
    {
        printf("匹配失败\n");
        return 0;
    }
    return 0;
}
//元素入栈
int PushStack(PSnode SS, ElemType *ee)
{
    if (SS == NULL)
    {
        printf("传参出错\n");
        return 0;
    }
    Snode *Temp = (Snode *)malloc(sizeof(Snode));
    memcpy(&Temp->Data, ee, sizeof(ElemType));
    Temp->Pnext = SS->Pnext;
    SS->Pnext = Temp;
    return 1;
}
//看栈顶元素
int PFStack(PSnode SS, char *ee)
{
    if (IsEmpty(SS) == 1)
        return 0;
    // strcpy(ee, &SS->Pnext->Data.Data);
    *ee = SS->Pnext->Data.Data;//修改位置
    cout << ee << endl;
} //元素出栈

int PopStack(PSnode SS, ElemType *ee)
{
    if (SS == NULL)
    {
        printf("传参出错\n");
        return 0;
    }
    if (IsEmpty(SS) == 1)
    {
        printf("栈为空出毛线\n");
    }
    Snode *Temp = SS->Pnext;
    SS->Pnext = Temp->Pnext;
    memcpy(ee, &Temp->Data, sizeof(ElemType));
    free(Temp);
    return 1;
}
//打印链表中的全部元素
//从栈首开始打印
void PrintfSnode(PSnode SS)
{
    if (SS == NULL)
    {
        printf("传参出错\n");
        return;
    }
    Snode *Temp = SS->Pnext;
    for (int kk = 1; Temp != NULL; kk++)
    {
        printf("第%d个元素的值是%s\n", kk, Temp->Data.Data);
        Temp = Temp->Pnext;
    }
}
//判空操作
int IsEmpty(PSnode SS)
{
    if (SS == NULL)
    {
        printf("传参出错\n");
        return 0;
    }
    if (SS->Pnext == NULL)
        return 1;
    else
        return 0;
} //毁灭链栈
void DestroySnode(PSnode SS)
{
    ClearSnode(SS);
    free(SS);
    SS = NULL;
}
//求链栈的长度
int LengthSnode(PSnode SS)
{
    int Length = 0;
    Snode *Temp = SS->Pnext;
    while (Temp != NULL)
    {
        Length++;
        Temp = Temp->Pnext;
    }
    return Length;
}
//清空链栈
int ClearSnode(PSnode SS)
{
    if (SS == NULL)
    {
        printf("传参出错\n");
        return 0;
    }
    Snode *Temp = SS->Pnext;
    while (Temp != NULL)
    {
        SS->Pnext = Temp->Pnext;
        free(Temp);
        Temp = SS->Pnext;
    }
    return 1;
}
//初始化
PSnode InitialSnode()
{
    Snode *Temp = (Snode *)malloc(sizeof(Snode));
    Temp->Pnext = NULL;
    memset(&Temp->Data, 0, sizeof(ElemType));
    return Temp;
}