0
点赞
收藏
分享

微信扫一扫

数据结构:利用栈实现回文的判断(c/c++版)

月白色的大狒 2022-03-17 阅读 133

一.头文件

#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

举报

相关推荐

0 条评论