迷惑
贴一下源代码我调一下试试?
大概改了一下,你用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;
}