栈与队列习题:回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
```#include<stdio.h> //用了c++里的&和cin.getline(),所以得用.cpp 等运行成功之后看下换成指针试下
#include<string.h> //strlen
#include<stdlib.h> //malloc
#include<iostream>
using namespace std;
typedef struct //重定义struct为Stack
{
int stack_size;
int top;
char* ch;
}Stack;
int InitStack( Stack&s,char* t) //初始化顺序栈的大小
{
int length = strlen(t);
s.ch = (char*)malloc(length * sizeof(char)); //初始化了顺序栈的大小
s.stack_size = length;
if (s.ch != NULL)
{
s.top = 0; //将顺序栈置空,等会top++从数组t【0】开始
}
return 0;
}
int Push(Stack& s, char e) //入栈
{
if (s.top == s.stack_size)// 判断栈是否上溢
return 1;
s.ch[s.top] = e;
s.top++;
return 0;
}
char Pop(Stack& s) //出栈
{
char temp;
if (s.top == 0) //判断栈是否下溢
return 1;
else
{
s.top--; // 因为上面入栈最后有个top++,会使指针再向上指一个值为空
temp = s.ch[s.top];
return temp;
}
}
int IsPlalindrome(char* t) //判断是否为回文
{
Stack s;
int len, i = 0;
InitStack(s, t); //先初始化栈
len = strlen(t); //求出字符串的长度
for ( i = 0; i < len / 2; i++)
Push(s, t[i]); //在主函数中已经把它初始化了
if (len % 2 == 1)
i++;
while (s.top >0) // 一开始我这里是>=0,就会造成多循环一次,直接返回0
{
if (Pop(s) != t[i])
{
return 0; //等会再函数(0)就为假
}
i++;
}
return 1;
}
int main()
{
int len=0;
char* str;
printf("你要输入几个字符:");
scanf_s("%d", &len); //读取到换行符时截至,把\n留在了缓冲区。
getchar(); //吃掉回车
str = (char*)malloc(len * sizeof(char));
printf("请输入字符串:");
gets_s(str,len+1); // 不管是gets还是getline都给我报了内存缓冲区的错误
//cin.getline(str,(len+1)); //遇到换行\n停止读入 输入4 assa str只有ass +1把空格读进来再抛弃
if (IsPlalindrome(str))
printf("是回文串");
else
printf("不是回文串");
free(str);
return 0;
}