今天主要给大家分享一下用栈的思想,实现判断一个数是否为回文数的的算法,本身算法呢十分简单 下面是题目描述:
要求输入一行字符判断是否回文,所谓回文呢就是正读反读都一样。例如:123321(是回文): abc(不是回文),
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MAXCHAR 50
struct node{
char data;
struct node *next;
}; //该结构体用于存放数据
struct Stack{
char stack [MAXCHAR];
int top;
}; //基于数组实现的栈
void init(struct Stack *s) {
s->top = 0; //实现栈的初始化
}
void push(struct Stack *s, char n) {
s->top++;
s->stack[s->top] = n; //把元素压入栈中
}
int pop (struct Stack *s){
char temp = s->stack[s->top];
s->top--;
return temp; //出栈
}
int ishs(struct node *head, int n){
struct Stack *s;
s = (struct Stack*)malloc(sizeof(struct Stack));
init(s); //初始化
int i = 0;
struct node *p;
p = head;
for(i = 0; i < n/2; i++){
push(s,p->data); //这里我们主要将传入数据前面一半给
p = p->next; //栈存储 然后后面的一半由链表自身存储
}
if(n%2 == 1){
p = p->next; //当数据个数为奇数是我们无需比较最中间的数
} //故指针向后挪一位
while(s->top>=1&&p!=NULL && s->stack[s->top]==p->data){
p = p->next; //指针往后挪一位 对应一次出栈
pop(s);
}
if(s->top == 0 && p == NULL) //如果逐项比较结束 栈和链表同时为空
return 1; //那么即为回文数 return 1;
else
return 0;
}
int main() {
struct node *head,*p,*q;
head = NULL; //头结点
int i = 0;
char s[MAXCHAR];
cout<<"请输入\n";
cin>>s;
while(s[i] != '\0'){
p = (struct node*)malloc(sizeof(struct node));
p->data = s[i];
p->next = NULL;
if(head == NULL){ //若头结点为空 则指向第一个元素
head = p;
q = p;
}else{
q->next = p;
q = p; //q指针始终指向最后
}
i++; //用于记录一共有多少数据
}
ishs(head,i);
if(ishs(head,i)) //根据返回值 判断输出回文
cout<<s<<"是回文数";
else
cout<<s<<"不是回文数";
}
具体的代码如上 其中还有一些地方不完整 比如入栈时没有判断是否栈满的情况,还有诸如链表没有没有释放的问题 总之仅供参考