feat(datastructure.test4): 新增实验四的内容
This commit is contained in:
@@ -13,5 +13,6 @@
|
||||
.
|
||||
├── test1 # 实验1
|
||||
├── test2 # 实验2
|
||||
└── test3 # 实验3
|
||||
├── test3 # 实验3
|
||||
└── test4 # 实验3
|
||||
```
|
||||
|
||||
162
DataStructure/test4/实验四.cpp
Normal file
162
DataStructure/test4/实验四.cpp
Normal file
@@ -0,0 +1,162 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAXSIZE 100
|
||||
typedef struct Stack
|
||||
{
|
||||
char *base; // 栈底指针
|
||||
char *top; // 栈顶指针
|
||||
int stacksize; // 栈可用的最大容量
|
||||
int length; // 新增:用来判断栈是否为空
|
||||
} Stack;
|
||||
|
||||
// 初始化
|
||||
void InitStack(Stack &p)
|
||||
{
|
||||
p.base = new char[MAXSIZE]; // 分配空间
|
||||
// todo list 处理 栈顶指针top初始为base
|
||||
p.top = p.base;
|
||||
// todo list 处理stacksize、length
|
||||
p.length = 0;
|
||||
p.stacksize = MAXSIZE - p.length;
|
||||
}
|
||||
|
||||
#define OK 0
|
||||
#define ERROR 0
|
||||
typedef int Status;
|
||||
// 入栈
|
||||
Status Push(Stack &p, char e)
|
||||
{
|
||||
// if(//todo list) // 栈满
|
||||
if (p.length >= MAXSIZE) // 栈满
|
||||
return ERROR;
|
||||
// todo list //将元素e压入栈顶
|
||||
*(p.top) = e;
|
||||
// todo list //栈顶指针加1
|
||||
p.top++;
|
||||
|
||||
p.length++;
|
||||
return OK;
|
||||
}
|
||||
|
||||
// 出栈
|
||||
char Pop(Stack &p)
|
||||
{
|
||||
char e;
|
||||
// if(//todo list) // 栈空
|
||||
if (p.length == 0) // 栈空
|
||||
return ERROR;
|
||||
// todo list //栈顶指针减1
|
||||
p.top--;
|
||||
// todo list //取栈顶元素
|
||||
e = *p.top;
|
||||
|
||||
p.length--;
|
||||
return e;
|
||||
}
|
||||
|
||||
// 1、判断是否为回文串
|
||||
void Palindrome(Stack &S, char a[])
|
||||
{
|
||||
int i;
|
||||
// 栈清空
|
||||
S.top = S.base;
|
||||
S.length = 0;
|
||||
for (i = 0; a[i] != '\0'; i++)
|
||||
{
|
||||
// todo list //for循环 把字符串全部入栈Push()
|
||||
Push(S, a[i]);
|
||||
}
|
||||
for (i = 0; a[i] != '\0'; i++)
|
||||
{
|
||||
// todo list //for循环 对比串的两端元素,如果Pop(S) != a[i]则表明不是回文,退出
|
||||
if (Pop(S) != a[i])
|
||||
break;
|
||||
}
|
||||
if (i == strlen(a))
|
||||
{
|
||||
printf("------回文------\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("----不是回文----\n");
|
||||
}
|
||||
}
|
||||
|
||||
// 2、括号匹配检验——可参考课本P75
|
||||
// 只讨论由圆括号()和中括号[]组成的括号
|
||||
void Matching(Stack &S, char ch[])
|
||||
{
|
||||
int flag = 1; // flag初始为1,当 flag = 1时表示匹配成功
|
||||
int i = 0;
|
||||
// 栈清空
|
||||
S.top = S.base;
|
||||
S.length = 0;
|
||||
|
||||
// todo list //while做括号匹配检验:
|
||||
while (ch[i] != '\0' && flag)
|
||||
{
|
||||
// 若为左括号,则将其入栈;
|
||||
if (ch[i] == '(' || ch[i] == '[')
|
||||
{
|
||||
Push(S, ch[i]);
|
||||
}
|
||||
// 若为右括号,则与出栈的栈顶元素进行比较,分析是否能够配对(如果不匹配,注意将flag置为0 )。
|
||||
else if (ch[i] == ')' || ch[i] == ']')
|
||||
{
|
||||
if (S.length == 0)
|
||||
{
|
||||
flag = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
char top = Pop(S);
|
||||
if ((ch[i] == ')' && top != '(') || (ch[i] == ']' && top != '['))
|
||||
{
|
||||
flag = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
if (S.length == 0 && flag) // 栈空且flag = 1时,括号匹配
|
||||
printf("-----括号匹配-----\n");
|
||||
else
|
||||
printf("----括号不匹配----\n");
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
char a[20], b[20];
|
||||
Stack s;
|
||||
InitStack(s);
|
||||
int choose = -1;
|
||||
printf("------------------------------------\n");
|
||||
printf("1.判断是否是回文字符串\n");
|
||||
printf("2.判断括号是否匹配\n");
|
||||
printf("0.退出\n");
|
||||
printf("------------------------------------\n");
|
||||
while (choose)
|
||||
{
|
||||
printf("请输入选项:");
|
||||
scanf("%d", &choose);
|
||||
switch (choose)
|
||||
{
|
||||
case 1:
|
||||
printf("请输入一个字符串:");
|
||||
scanf("%s", a);
|
||||
Palindrome(s, a);
|
||||
break;
|
||||
case 2:
|
||||
printf("请输入一个字符串(由圆括号和中括号组成):");
|
||||
scanf("%s", b);
|
||||
Matching(s, b);
|
||||
break;
|
||||
case 0:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user