一.头文件
#include<iostream>
#include<string.h> //用于字符串长度的判断
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 10
typedef int Status;
typedef struct
{
char ch;
}ch;
typedef struct Snode
{
ch data;
struct Snode* next;
}Snode,*Slink;
Status initstack(Slink& S)
{
S = NULL;
return OK;
}
从头文件中可以看到,这个程序使用链栈的结构组成。
栈中元素用一个结构体定义,结构体为ch;而maxsize是定义输入字符串的最大长度。文末很重要。
二.主函数
int main()
{
char c[MAXSIZE];
cout << "请输入字符串:";
cin >> c;
Slink S;
initstack(S); //初始化函数
if (pali(S, c) == OK) //通过返回值来判断是否是回文序列
cout << "是回文";
else
cout << "不是回文";
return 0;
}
在主函数中initstack对链栈进行初始化,输入字符数组,后用pali函数来判断是否是回文。
三.实现函数
(1)初始化函数
Status initstack(Slink& S)
{
S = NULL;
return OK;
}
这就不用多解释了
(2)判断函数
定义字符元素e与e1来保存需要对比的两个字符。用strlen函数来判断字符串的长度,而m是字符串一般后的值,如果输入的字符串是回文,那么从m元素开始,m++遍历的每个值应该与出栈的元素依次对应。
首先将字符串一半的元素此次压入栈中,然后将栈中元素依次出栈。如果与字符串的后半部分相同,则是回文,否则不是回文。
Status pali(Slink& S, char c[MAXSIZE])
{
char e, e1;
Snode* p, * q;
int n = strlen(c), i, m = n - n / 2;
for (i = 0; i < n / 2; i++) //将字符串的一半压入栈
{
p = new Snode;
p->data.ch = c[i];
p->next = S;
S = p;
}
for (i = 0; i < n / 2; i++) //将入栈元素依次出栈
{
q = new Snode;
e = S->data.ch;
q = S;
S = S->next;
delete q;
e1 = c[m + i]; //从n-n/2开始递增与栈顶元素进行比较
if (e != e1)
return ERROR;
}
return OK;
}
本篇文章为一次作业要求的内容,已经进行了运行测试。本人正在学习如果有什么问题欢迎讨论斧正。(希望老师如果看到,能了解我的实验并不是在网上抄的啊)
F_NCIAE_A231_2022/3/17