用栈和队列判断回文
数据结构回文实验报告
数据结构回文实验报告1. 实验目的本实验旨在通过使用数据结构中的栈和队列的知识,设计并实现一个回文判断程序,以检测给定的字符串是否为回文。
2. 实验原理回文是指正读和反读都相同的字符串。
在本实验中,我们将使用栈和队列来判断给定字符串是否为回文。
具体步骤如下:2.1 将字符串加入栈和队列将给定的字符串依次加入栈和队列中,保持顺序一致。
2.2 从栈和队列中弹出字符从栈和队列中分别弹出字符,并进行比较。
2.3 判断是否为回文如果所有字符都一一相等,那么该字符串就是回文。
否则,不是回文。
3. 实验步骤接下来,我们将按照上述原理,逐步进行回文判断的实验。
3.1 导入所需库由于本实验仅使用了基本的数据结构,无需导入额外的库或模块。
3.2 创建栈和队列首先,我们需要创建栈和队列的数据结构。
栈可以通过使用列表来实现,而队列则可以通过使用双端队列来实现。
# 创建栈stack = []# 创建队列from collections import dequequeue = deque()3.3 输入字符串接下来,我们需要从用户获取一个待判断的字符串。
# 获取待判断的字符串string = input("请输入待判断的字符串:")3.4 将字符串加入栈和队列将输入的字符串依次加入栈和队列中。
# 将字符串加入栈和队列for char in string:stack.append(char)queue.append(char)3.5 从栈和队列中弹出字符并比较从栈和队列中分别弹出字符,并进行比较,直到栈或队列为空。
is_palindrome =Truewhile len(stack) >0and len(queue) >0:stack_char = stack.pop()queue_char = queue.popleft()if stack_char != queue_char:is_palindrome =Falsebreak3.6 输出判断结果根据比较结果,输出判断字符串是否为回文。
实验报告——栈和队列的应用
实验5 栈和队列的应用目的和要求:(1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。
一、题目题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。
所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。
例如,a+b&b+a等等。
题目2. 假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。
跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。
若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
现要求写一算法模拟上述舞伴配对问题,并实现。
题目3. 打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。
请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。
题目4. 假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。
试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
题目5. 利用循环链队列求解约瑟夫环问题。
请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。
选择题目3:打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
二、程序清单//Ch3.cpp#include<iostream.h>#include<stdio.h>#include"ch3.h"template <class T>void LinkedQueue<T>::makeEmpty()//makeEmpty//函数的实现{LinkNode<T>*p;while(front!=NULL)//逐个删除队列中的结点{p=front;front=front->link;delete p;}};template <class T>bool LinkedQueue<T>::put_in(T&x){//提交命令函数if(front==NULL){//判断是否为空front=rear=new LinkNode<T>;//如果为空,新结点为对头也为对尾front->data=rear->data=x;if(front==NULL) //分配结点失败return false;}else{rear->link=new LinkNode<T>;//如不为空,在链尾加新的结点rear->link->data=x;if(rear->link==NULL)return false;rear=rear->link;}return true;};template <class T>bool LinkedQueue<T>::carry_out()//执行命令函数{if(IsEmpty()==true)//判断是否为空{ return false; }cout<<front->data<<" ";//输出链尾的数据,代表执行打印命令LinkNode<T>*p=front;front=front->link;//删除以执行的命令,即对头修改delete p; //释放原结点return true;};void main() //主函数{LinkedQueue<char> q;//定义类对象char flag='Y'; //标志是否输入了命令const int max=30;//一次获取输入命令的最大个数while(flag=='Y') //循环{int i=0;char str[max]; //定义存储屏幕输入的命令的数组gets(str); //获取屏幕输入的命令while(str[i]!='\0'){q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中i++;}for(int j=0;j<=i;j++){if(q.IsEmpty()==true) //判断是否为空,为空则说明没有可执行的命令{cout<<"已经没有可执行的命令!是否继续输入命令(Y|N)?"<<endl;cin>>flag;continue; //为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。
用栈实现回文判断的算法
用栈实现回文判断的算法回文是指正读和反读都相同的字符串或序列,如"level"、"madam"等。
判断一个字符串是否为回文是编程中常见的问题,本文将介绍如何利用栈来实现这一功能。
栈是一种特殊的线性数据结构,具有后进先出(Last-In-First-Out,LIFO)的特点。
栈可以通过压栈(push)和弹栈(pop)操作来实现数据的存储和访问。
以字符串为例,我们可以通过将字符串中的每个字符依次入栈,然后再依次出栈,得到一个与原字符串相反的字符串。
如果这两个字符串相等,那么原字符串就是回文。
具体实现时,我们可以使用一个辅助栈来完成入栈和出栈操作。
首先,将原字符串的每个字符依次入栈,然后依次出栈并拼接到一个新的字符串中。
最后,将新的字符串与原字符串进行比较,如果相等,则原字符串是回文。
下面是用栈实现回文判断的算法的详细步骤:1. 创建一个空栈和一个空字符串。
2. 遍历原字符串的每个字符:- 将当前字符入栈。
3. 弹栈并将弹出的字符拼接到新字符串中,直到栈为空。
4. 将新字符串与原字符串进行比较:- 如果相等,则原字符串是回文;- 如果不相等,则原字符串不是回文。
下面是用栈实现回文判断的算法的Python代码实现:```pythondef is_palindrome(s):stack = []new_s = ""for c in s:stack.append(c)while stack:new_s += stack.pop()return new_s == s# 测试print(is_palindrome("level")) # 输出 Trueprint(is_palindrome("hello")) # 输出 False```通过上述算法的实现,我们可以用栈来判断一个字符串是否为回文。
算法的时间复杂度为O(n),其中n是字符串的长度。
利用栈和队列判断字符是否是回文(C语言)
利⽤栈和队列判断字符是否是回⽂(C语⾔)// File Name: palindrome.h//// Destination:利⽤栈和队列判断字符串是否是回⽂//#ifndef PALINDROME#define PALINDROME#include <stdio.h>// 链式队列结构的定义typedef char ElemType;typedef struct Node{char data; // 元素数据struct Node *next;// 链式队列中结点元素的指针}QNode,*QueuePtr;typedef struct{QueuePtr front;// 队列头指针QueuePtr rear;// 队列尾指针}LinkQueue;// 栈结构的定义typedef struct Stack{ElemType *base;ElemType *top;int stacksize;}SqStack;// 链式队列的基本操作bool InitQueue(LinkQueue *Q);bool EnQueue(LinkQueue *Q, ElemType e);bool DeQueue(LinkQueue *Q, ElemType *e);// 栈的基本操作bool InitStack(SqStack *S);bool Push(SqStack *S, ElemType e);bool Pop(SqStack *S, ElemType *e);#endif// File Name: palindrome.cpp//// Destination:利⽤栈和队列判断字符串是否是回⽂#include <stdlib.h>#include <malloc.h>#include "palindrome.h"const int STACK_INIT_SIZE = 100; // 初始分配的长度const int STACKINCREMENT = 10; // 分配内存的增量//操作⽬的:初始化队列//初始条件:⽆//操作结果:构造⼀个空的队列//函数参数://LinkQueue *Q 待初始化的队列//返回值:// bool 操作是否成功------------------------------------------------------------*/bool InitQueue(LinkQueue *Q){Q->front = Q->rear = (QueuePtr)malloc(sizeof (QNode)); if (!Q->front){exit(0);}Q->front->next = NULL;return true;}//操作⽬的:在队列末尾插⼊元素e//初始条件:队列Q已存在//操作结果:插⼊元素e作为队列新的尾结点//函数参数://LinkQueue *Q 队列Q//ElemType e 待插⼊的数据元素//返回值://bool 操作是否成功bool EnQueue(LinkQueue *Q, ElemType e){QueuePtr p = (QueuePtr)malloc(sizeof(QNode));if (!p){exit(0);}p->data = e;p->next = NULL;Q->rear->next = p;Q->rear = p;return true;}//操作⽬的:删除链式队列的头结点//初始条件:队列Q已存在//操作结果:删除链式队列的头结点//函数参数://LinkQueue *Q 队列Q//ElemType *e 待插⼊的数据元素//返回值://bool 操作是否成功bool DeQueue(LinkQueue *Q, ElemType *e){if (Q->front == Q->rear) //空队列{return false;}QueuePtr p = Q->front->next;//p指向头结点的下个位置 *e = p->data;Q->front->next = p->next;if (Q->rear == p){Q->rear = Q->front;}free(p);return true;}//操作⽬的:初始化栈//初始条件:⽆//操作结果:构造⼀个空的栈//函数参数:// SqStack *S 待初始化的栈//返回值:// bool 操作是否成功bool InitStack(SqStack *S){S->base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));if (S->base == NULL){return false;}S->top = S->base;S->stacksize = STACK_INIT_SIZE;return true;}//操作⽬的:压栈——插⼊元素e为新的栈顶元素//初始条件:栈S已存在//操作结果:插⼊数据元素e作为新的栈顶//函数参数://SqStack *S 栈S//ElemType e 待插⼊的数据元素//返回值:// bool 操作是否成功bool Push(SqStack *S, ElemType e){if (S->top - S->base >= S->stacksize){S->base = (ElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType)); if (!S->base){return false;}S->top = S->base + S->stacksize;S->stacksize += STACKINCREMENT;}*(S->top++) = e;return true;}//操作⽬的:弹栈——删除栈顶元素//初始条件:栈S已存在且⾮空//操作结果:删除S的栈顶元素,并⽤e返回其值//函数参数://SqStack *S 栈S//ElemType *e 被删除的数据元素值//返回值://bool 操作是否成功bool Pop(SqStack *S, ElemType *e){if (S->top == S->base)return false;*e = (*--S->top);return true;}// File Name: main.cpp//// Destination:利⽤栈和队列判断字符串是否是回⽂//------------------------------------------------------#include <stdio.h>#include <stdlib.h>#include "palindrome.h"int main (){//声明⼀个栈⼀个队列SqStack S;LinkQueue L;//初始化⼀个栈⼀个队列InitStack (&S);InitQueue (&L);char c[30];ElemType a,b;printf("请输⼊要判断的字符,以@结束(最多30个字符):"); scanf("%s",c);int i = 0;int flag1 = 0;int flag2 = 0;while (c[i] != '@'){Push(&S,c[i]); //⼊栈EnQueue(&L,c[i]);//⼊队列flag1++;i++;}while (!(S.top == S.base)){Pop(&S,&b);//出栈DeQueue(&L,&a);//出队列if (a==b){flag2++;}else{break;}}if (flag1 == flag2){printf("\n是回⽂!\n\n");}else{printf("\n不是回⽂!\n\n");}system("pause");return 0;}。
利用链式堆栈和队列实现回文判断范文
}
*d=p->data;
}
7:撤销堆栈:
void Destory(StNode *head)
{
StNode *p,*p1;
p=head;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
2、把对队列的创建及操作函数放到LQueue头文件下:
1:头结点结构体的创建:
二、实验目的
熟练运用堆栈和队列的各种操作,并会运用他们的特点做一些实际的应用。
二、实验步骤:
1、把堆栈的创建及操作函数放到LStack头文件下:
1:定义节点结构体:
typedef struct snode
{
DataType data;
struct snode *next;
}StNode;
2:初始化堆栈:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>
typedef int DataType;
#include"SLNode.h"
#include"Stack.h"
void main()
{
SLNode *la,*lb;
return 0;
}
p->data=x;
p->next=head->next;
head->next=p;
return 1;
}
5:出栈函数:
int StackPop(StNode *head,DataType *d)
数据结构回文判断
数据结构回文判断数据结构回文判断引言在计算机科学中,数据结构是指组织和存储数据的方式,是计算机算法的基础。
回文是一个正读和反读都一样的字符串,常用来判断一个字符串是否具有对称性。
在本文档中,我们将探讨如何使用数据结构来判断一个字符串是否是回文。
回文判断算法回文判断算法的基本思想是将字符串分割为两部分,然后将其中一部分做翻转操作,最后将翻转后的结果与另一部分进行比较。
如果两部分相等,则该字符串是回文。
以下是一个使用栈和队列数据结构实现的回文判断算法的伪代码:```function isPalindrome(string):stack = createStack()queue = createQueue()for char in string:stack.push(char)queue.enqueue(char)while stack.isNotEmpty() and queue.isNotEmpty():if stack.pop() != queue.dequeue():return Falsereturn True```如何使用数据结构进行回文判断栈(Stack)栈是一种后进先出(LIFO)的数据结构,它可以用来将元素依次压入栈中,并按照相反的顺序弹出。
在回文判断算法中,我们可以使用栈来实现将字符串逆序操作。
以下是使用栈实现回文判断的步骤:1. 创建一个空栈。
2. 将字符串的每个字符依次压栈。
3. 弹出栈中的字符,并将其与原字符串中的字符进行比较。
如果不相等,则该字符串不是回文。
4. 如果栈为空,且所有字符都相等,则该字符串是回文。
队列(Queue)队列是一种先进先出(FIFO)的数据结构,它可以用来将元素依次入队,并按照相同的顺序出队。
在回文判断算法中,我们可以使用队列来实现将字符串正序操作。
以下是使用队列实现回文判断的步骤:1. 创建一个空队列。
2. 将字符串的每个字符依次入队。
3. 弹出队列中的字符,并将其与原字符串中的字符进行比较。
数据结构用栈和队列判断回文数
数据结构⽤栈和队列判断回⽂数12321,你是不是你,这样的东西叫回⽂,由于队列和栈的存储⽅式不同,栈是LIFO,last in first out ,盘⼦⼀个⼀个堆,堆完后从上⾯开始拿;队列是FIFO,first in first out, 就像现实的排队。
将数字存进这两种结构中,逐⼀取出,如果相同,那就是回⽂数。
StackAndQueqe.h#include<stdio.h>typedef char DataType;typedef struct Node *PNode;struct Node{DataType info;PNode link;};typedef struct LinkQueqe *PQueqe;struct LinkQueqe{PNode f;PNode b;};typedef struct LinkStack *PStack;struct LinkStack{PNode top;};PStack createStack();int isEmptyStack(PStack pstack);void pushStack(PStack pstack,DataType element);DataType popStack(PStack pstack);DataType topStack(PStack pstack);void printStack(PStack pstack);PQueqe createQueqe();int isEmptyQueqe(PQueqe pqueqe);void pushQueqe(PQueqe pqueqe,DataType element);DataType popQueqe(PQueqe pqueqe);DataType topQueqe(PQueqe pqueqe);void printQueqe(PQueqe pqueqe);StackAndQueqe.c#include "StackAndQueqe.h"PQueqe createQueqe(){PQueqe pqueqe = (PQueqe)malloc(sizeof(struct LinkQueqe));if(pqueqe == NULL) printf("create fail");pqueqe ->f = NULL;pqueqe ->b = NULL;return pqueqe;}int isEmptyQueqe(PQueqe pqueqe){return (pqueqe ->f == NULL);}void pushQueqe(PQueqe pqueqe,DataType element){PNode p = (PNode)malloc(sizeof(struct Node));if(p == NULL) printf("nothing push");p ->info = element;p ->link = NULL;if(pqueqe ->f == NULL){pqueqe->f = p;//printf(" f %5d\n",pqueqe->f->info);}else pqueqe ->b ->link = p;pqueqe ->b = p;// printf("b %d\n",pqueqe->b->info);}DataType popQueqe(PQueqe pqueqe){PNode p;DataType temp;if(isEmptyQueqe(pqueqe)) printf("queqe is empty");p = pqueqe ->f;temp = p->info;pqueqe ->f = p->link;free(p);return temp;}DataType topQueqe(PQueqe pqueqe){if(pqueqe->f == NULL){printf("nothing top");return NULL;}return pqueqe -> f->info ;}void printQueqe(PQueqe pqueqe){PNode p = pqueqe ->f;if( isEmptyQueqe(pqueqe)){printf("nothing print");}while(pqueqe->f!= NULL){printf("%3c",pqueqe->f->info);pqueqe ->f = pqueqe ->f ->link;}pqueqe ->f = p;//此处的f随着link的变化变化最后需要还原回去!}PStack createStack(){PStack pstack = (PStack)malloc(sizeof(struct LinkStack));if(pstack == NULL) printf("create fail");pstack ->top = NULL;return pstack;}int isEmptyStack(PStack pstack){return(pstack->top == NULL);}void pushStack(PStack pstack,DataType element){PNode p = (PNode)malloc(sizeof(struct Node));if(p == NULL) printf("push fail");p ->info = element;p ->link = pstack ->top;pstack ->top = p;}DataType popStack(PStack pstack){PNode p;DataType temp;if(pstack ->top == NULL) printf("nothing pop");p = pstack ->top;temp = p->info;pstack ->top = pstack->top->link;free(p);return temp;}DataType topStack(PStack pstack){if(pstack ->top == NULL){printf("nothing pop");return NULL;}return pstack->top->info;}void printStack(PStack pstack){PNode p= pstack ->top;if(pstack ->top == NULL){printf("nothing pop");}while(pstack->top != NULL){printf("%3c",pstack ->top ->info);pstack ->top = pstack ->top ->link;}pstack ->top = p;}#include "StackAndQueqe.h"int main(){int i;char s[100];int n=0;PQueqe pqueqe ;PStack pstack;printf("please input string to judge whether it is a palindrome(回⽂数):\n"); scanf("%c",&s[0]);while(s[n]!='\n'){scanf("%c",&s[++n]);}printf(" the length is %d: \n",n);printf(" the string is : ");for(i=0;i<n;i++){printf("%c",s[i]);}pqueqe = createQueqe();for(i=0;i<n;i++){//printf("\n%c",s[i]);pushQueqe(pqueqe,s[i]);}pstack = createStack();for(i=0;i<n;i++){pushStack(pstack,s[i]);}printf(" \nthe queqe is : ");printQueqe(pqueqe);printf(" \nthe stack is : ");printStack(pstack);printf(" \n");for(i=0;i<n/2;i++){if(popQueqe(pqueqe)!= popStack(pstack)){printf("is not HUIWEN!\n");break;}else {printf("it is HUIWEN!\n");break;}}return 0;}简单的话只需要取出的数切半对⽐就⾏了。
回文判断的两种方法
回⽂判断的两种⽅法//想到两种⽅法,⼀是⽤栈把序列逆序对⽐,⼆是直接头尾对⽐字符串。
//问题:判断回⽂串如1223不是回⽂串,⽽1221是//思路1:分析以下回⽂的特点,会发现回⽂⽆论是正着读还是反着读都是⼀样的。
所以只要进⼀次栈,出⼀次栈,看进⼊序列是否⼀样就好了//思路2:直接判断前半段后半段对应位置是否相等。
有不等的就不是回⽂。
这个更简单些#include "stdio.h"#include "stdlib.h"#include "string.h"typedef struct stack{char data;stack *next;}stack;void Traversal(stack *p){ //遍历stack *q = p->next;while (q != NULL){printf("%C ",q->data);q = q->next;}}void init(stack *&s);int isEmpty(stack *s);void push(stack *&s,char x);int pop(stack *&s,char &x);//直接头尾对⽐判断回⽂// int huiwen(char *s,int n){ //回⽂返回0,⾮回⽂返回1// stack *c = (stack *)malloc(sizeof(stack));// c->next = NULL;// for(int i=0,j=n-1;i<=j;i++,j--){// if(s[i]!=s[j]) return 1; //数组版// }// return 0;// }//通过栈判断int huiwen(char *s,int n){ //参数:字符串s,字符串长度nstack *c = (stack *)malloc(sizeof(stack));c->next = NULL;for(int i=0;i<n;i++) push(c,s[i]);char a;for(int i=0;i<n;i++){pop(c,a);if(s[i] != a) return 1; //不是回⽂ //栈会把进栈序列逆序输出,如果输出序列等于字符串,那就是回⽂}return 0;}int main(){//string s="1221";char *str="ssccss";printf("%d",huiwen(str,6));getchar();return 0;}//注:在考试的时候直接调⽤函数就好了。
数据结构C语言回文判断(运用栈以及队列完成)
数据结构实验报告回文判断班级:学号:学生姓名:指导教师:时间:2015年5月5日1.实验目的:熟悉栈和队列的各项操作,区别栈和队列的操作原理。
2.实验内容:利用栈的操作完成读入的一个以@结尾的字符序列是否是回文序列的判断.回文序列即正读与反读都一样的字符序列;例如:123&321@是;123&4321@、123&312@不是算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为@停止输入,因为要满足特定的要求:序列1&序列2,故设置夜歌标记量falg=1,判断输入的元素个数是否为奇数个,若为偶数个则令flag=0,若为奇数个继续判断栈的中间元素是否为&,若不是则令flag=0,若是,将栈和队列中的元素依次出列,判断是否相等,若不相等则令flag=0,最后将flag的值返回给主函数,若flag被修改为0说明不是回文序列,否则反之!!判断回文序列的流程图:算法实现:(1)void InitStack(SeqStack *s):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作;(2)int push(SeqStack *s,char ch):入栈操作,即给空栈中写入数据;(3)int pop(SeqStack *s,char *x):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序;(4)void InitQuene(LinkQ *q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作;(5)int enter(LinkQ *q,char ch):入队操作,即给空队列中写入数据;(6)int deleteq(LinkQ *q,char *c):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序;(7)int huiwen(SeqStack s,LinkQ q):输入序列并判断所输入的序列是否是回文序列;(8)void main():主函数,用于调用前面的模块,并输出最终的判断结果。
用栈实现回文判断的算法
用栈实现回文判断的算法回文是指正读和反读都一样的字符串,例如"level"、"radar"等。
回文判断是计算机科学中的一个经典问题,也是算法学习中常见的一个练习题。
本文将介绍如何使用栈来实现回文判断的算法。
我们需要明确栈的概念。
栈是一种特殊的数据结构,它的特点是后进先出(Last-In-First-Out,LIFO)。
在栈中,我们只能在栈的顶部进行插入和删除操作。
这就意味着最后一个插入的元素将是第一个被删除的元素。
回文判断的思路是将字符串的每个字符依次入栈,然后再依次出栈与字符串的字符进行比较。
如果每一次出栈的字符与字符串对应位置的字符相等,那么这个字符串就是回文;如果有任何一次出栈的字符与字符串对应位置的字符不相等,那么这个字符串就不是回文。
接下来,我们来实现这个算法。
首先,我们需要定义一个栈的数据结构,并实现栈的入栈和出栈操作。
这里我们可以使用数组来实现栈。
```pythonclass Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if not self.is_empty():return self.stack.pop()def is_empty(self):return len(self.stack) == 0```接下来,我们可以定义一个函数来判断一个字符串是否是回文。
首先,我们需要将字符串的每个字符入栈,然后再依次出栈与字符串的字符进行比较。
如果比较过程中有任何一个字符不相等,那么这个字符串就不是回文;如果全部字符比较完成后都相等,那么这个字符串就是回文。
```pythondef is_palindrome(string):stack = Stack()for char in string:stack.push(char)for char in string:if char != stack.pop():return Falsereturn True```我们可以测试一下这个算法的正确性。
数据结构回文序列判断实验报告
数据结构回文序列判断实验报告1.实验目的本实验旨在通过使用数据结构中的栈来判断一个给定的序列是否为回文序列。
2.实验原理回文序列是指正读和反读都相同的序列。
在本实验中,我们使用栈来实现回文序列的判断。
具体原理如下:-将给定的序列逐个字符入栈,直到遇到序列结束符(如空格或结束符号)。
-之后,将栈中的字符逐个出栈,并与序列的对应字符比较。
-如果出栈的字符与序列的对应字符不相同,则该序列不是回文序列;如果全部对应字符相同,则该序列是回文序列。
-需要注意的是,如果序列为奇数个字符,那么中间的字符可以不进行比较。
3.实验步骤本实验的具体步骤如下:1)初始化一个空栈。
2)读入一个字符,并将其入栈,直到遇到序列结束符。
3)读入序列的每一个字符,并将其与栈顶字符进行比较。
4)如果比较结果不相同,则该序列不是回文序列;如果比较结果相同,则继续比较下一个字符。
5)如果栈为空且所有字符都比较完毕,则该序列是回文序列;否则,该序列不是回文序列。
4.实验结果本实验使用了多组样例数据进行测试,以下是部分实验结果:- 输入序列:"aba",输出:是回文序列。
- 输入序列:"abcba",输出:是回文序列。
- 输入序列:"abcca",输出:不是回文序列。
- 输入序列:"abcdcba",输出:是回文序列。
5.实验分析通过对实验结果的分析,可以得出以下结论:-本实验的算法能够正确判断给定序列是否为回文序列。
-由于使用了栈来辅助判断,算法的时间复杂度为O(n),其中n为序列的长度。
6.实验总结本实验通过使用数据结构中的栈,成功判断了一个给定序列是否为回文序列。
通过实验过程,我们深入理解了栈的应用和回文序列的判断原理,并熟悉了实际编程的过程。
同时,我们也认识到了栈在解决一些问题时的便捷性和高效性。
在今后的学习和工作中,我们将更加熟练地运用栈来解决问题。
栈判断回文实验报告
一、实验目的1. 理解栈的基本原理和操作。
2. 掌握使用栈判断字符串是否为回文的算法。
3. 分析算法的效率,并优化算法。
二、实验背景回文是一种特殊的字符串,它从前往后读和从后往前读都是相同的。
例如,“madam”、“racecar”等都是回文。
判断一个字符串是否为回文是一个常见的问题,而使用栈来解决这个问题是一种有效的方法。
三、实验内容1. 设计一个栈类,实现栈的基本操作:初始化、入栈、出栈、判断栈是否为空。
2. 编写一个函数,使用栈来判断一个字符串是否为回文。
3. 分析算法的效率,并进行优化。
四、实验步骤1. 定义栈类```pythonclass Stack:def __init__(self):self.items = []def is_empty(self):return len(self.items) == 0def push(self, item):self.items.append(item)def pop(self):if not self.is_empty():return self.items.pop()return Nonedef peek(self):if not self.is_empty():return self.items[-1]return None```2. 编写判断回文函数```pythondef is_palindrome(s):stack = Stack()for char in s:stack.push(char)result = Truewhile not stack.is_empty():if stack.pop() != s[stack.size() - 1 - stack.index()]:result = Falsebreakreturn result```3. 分析算法效率在这个算法中,我们需要遍历整个字符串一次来入栈,然后再遍历一次出栈。
因此,时间复杂度为O(n),其中n为字符串的长度。
队列与栈判断回文
1.用顺序表队列做回文判断#include<iostream>using namespace std;const int queueSize=50;typedef struct sqqueue{int data[50];int front,rear;}SqQueue;void InitQueue(SqQueue &sq) {sq.rear=sq.front=0;}int EnQueue(SqQueue &sq,int x) {if((sq.rear+1)%50==sq.front)return 0;sq.rear=(sq.rear+1)%50;sq.data[sq.rear]=x;return 1;}int DeQueue(SqQueue&sq,int &x) {if(sq.rear==sq.front)return 0;sq.front=(sq.front+1)%50;x=sq.data[sq.front];return 1;}int main(){bool Temp=true;SqQueue sq;int i,j,n,a[50],b[50];InitQueue(sq);cout<<"输入数字的个数:";cin>>n;cout<<"输入一段整形数字:";for(i=0;i<n;i++){cin>>a[i];EnQueue(sq,a[i]);}for(j=0;j<n;j++){DeQueue(sq,b[j]);}for(i=0;i<n;i++)if(a[n-i-1]!=b[i]){Temp=false;}if(Temp==true) cout<<"输入的文字回文";else cout<<"输入的文字不是回文";return 0;}2用链对做回文判断#include<iostream>using namespace std;typedef struct QNode{int data;struct QNode *next;}QType;typedef struct qptr{QType *front,*rear;}LinkQueue;void InitQueue(LinkQueue *&lq){lq=(LinkQueue *)malloc(sizeof(QType));lq->rear=lq->front=NULL;}void EnQueue(LinkQueue *&lq,int x){QType *s;s=(QType *)malloc(sizeof(QType));s->data=x;s->next=NULL;if(lq->front==NULL&&lq->rear==NULL)lq->rear=lq->front=s;else{lq->rear->next=s;lq->rear=s;}}int DeQueue(LinkQueue *&lq,int &x){QType *p;if(lq->front==NULL&&lq->rear==NULL) return 0;p=lq->front;x=p->data;if(lq->rear==lq->front)lq->rear=lq->front=NULL;elselq->front=lq->front->next;free(p);return 1;}int main(){LinkQueue *lq;InitQueue(lq);bool Temp=true;int i,j,n;int a[50],b[50];cout<<"请输入要判断文字的个数:";cin>>n;cout<<"输入要判断的文字:";for(i=0;i<n;i++){cin>>a[i];EnQueue(lq,a[i]);}for(i=0;i<n;i++){DeQueue(lq, b[i]);}for(j=0;j<n;j++)if(a[n-j-1]!=b[j]){Temp=false;}if(Temp==true)cout<<"输入的文字是回文\n";elsecout<<"输入的文字不是回文\n";return 0;}队列和栈#include<iostream.h>#include<string.h>#include<stdlib.h>//双栈数据结构定义typedef struct{int size;//栈的大小int length1;//栈1长度int length2;//栈2长度char *data;//数据}*PStack,Stack;//自定义类型错误信息enumStatus{ERROR_OK=0,ERROR_MEMORY_FALIED,ERROR_STACK_ERROR,ERROR_OK_ YES,ERROR_OK_NO};void GetErrorMsg(const Status errCode)//显示错误信息{char strMsg[256];switch(errCode){case ERROR_OK:strcpy(strMsg,"执行成功!");break;case ERROR_MEMORY_FALIED:strcpy(strMsg,"内存分配错误!");break;case ERROR_STACK_ERROR:strcpy(strMsg,"数据错误!");break;case ERROR_OK_YES:strcpy(strMsg,"判断成功:结果是回文!");break;case ERROR_OK_NO:strcpy(strMsg,"判断成功:结果不是回文!");break;default:strcpy(strMsg,"Unknown Error !");break;}cout<<strMsg<<endl;}Status CreateStack(PStack&pst,char*str)//根据相应的字符串创建栈{pst=new Stack;if(pst==NULL)//创建栈失败返回return ERROR_MEMORY_FALIED;pst->length1=0;pst->length2=0;pst->size=strlen(str)+1;pst->data=new char[pst->size];//分配数据空间::memset(pst->data,0,strlen(str));//初始栈内数据if(pst->data==NULL)//空间分配失败返回{return ERROR_MEMORY_FALIED;}char *pTemp,*qTemp;pTemp=str;qTemp=str;qTemp+=strlen(str)-1;//将指针移到字符串尾int i=0;while(pTemp<=qTemp)//将字符串中的字符压入双栈{pst->data[i]=*pTemp;pst->data[pst->size-i]=*qTemp;pst->length1++;pst->length2++;i++;pTemp++;qTemp--;}return ERROR_OK;}Status GetResult(const PStack&pst)//获取结果{if(pst->length1!=pst->length2||pst==NULL){return ERROR_STACK_ERROR;}//如果数据有误返回while(pst->length1!=0)//依次取出栈中元素比较{if(pst->data[--pst->length1]!=pst->data[pst->size-(--pst->length2)]) return ERROR_OK_NO;//如果不相等返回ERROR_OK_NO}return ERROR_OK_YES;}void main(){PStack pst;char str[256];cout<<"******************************************"<<endl <<"************欢迎使用回文判断程序**********"<<endl<<"******************************************"<<endl;cout<<"Pelease Enter A String:";cin>>str;if(ERROR_OK==CreateStack(pst,str)){GetErrorMsg(GetResult(pst));}system("pause");}。
13131116钱剑滨_队列和栈判断回文
13131116钱剑滨_队列和栈判断回文13软工转本1 钱剑滨实验报告利用队列和栈判断回文实验报告信息工程系 13软工转本1 日期 2019年03月20日姓名钱剑滨学号 13131116 电话 [1**********]一、实验内容编写关于栈和队列操作的C 语言程序,要求能判断输入字符串是否为回文(回文:正序和逆序一样)。
二、实验步骤1. 分析栈和队列的实现算法。
2. 编写程序,通过队列来实现字符串正序输出,通过栈来实现字符串逆序输出。
3. 运行程序,纠正错误,对预测结果进行验证。
三、设计概要1. 本实验包含了7个函数:a) 主函数 main()b) 接收字符串函数get_string ()c) 初始化队列函数init_queue ()d) 初始化栈函数 init_stack ()e) 入队函数 enter_queue ()f) 出队函数 out_queue()g) 压栈函数 push ()h) 出栈函数 pop()i) 字符串比较函数contrast()四、程序设计1. 函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include#include#include#define N 100 //输入字符串的最大长度typedef struct SeqQuene //定义循环队列{char *pBase_queue;int front;int rear;}SeqQueue;typedef struct SeqStack //定义栈{char *pBase_stack;int bottom;int top;}SeqStack;/*函数声明*/void get_string(char *string_get, int *qString_side); //接受字符串void init_queue(SeqQueue *queue, int string_side); //初始化队列void init_stack(SeqStack *stack, int string_side); //初始化栈void enter_queue(SeqQueue *queue, char *string_get, intstring_side); //入队void out_queue(SeqQueue *queue, char *string_queue, intstring_side); //出队void push(SeqStack *stack, char *string_get, int string_side); //压栈 void pop(SeqStack *stack, char *string_stack, int string_side);//出栈void contrast(char *string_stack, char *string_queue, int string_side);//字符串比较2. 主函数main()void main(){SeqStack stack; //这里定义普通变量,下面再传地址 SeqQueue queue; //如果定义指针变量会报错 char *string_get, *string_queue, *string_stack;//定义字符指针,分别存放接收字符串、顺序输出字符串、逆序输出字符串int string_side; //定义接收字符串的长度string_get = (char *)malloc(sizeof (char) * N);//给字符指针分配空间,必须在声明的函数内部get_string(string_get, &string_side); //接受字符串string_queue = (char *)malloc(sizeof (char) * (string_side + 1));string_stack = (char *)malloc(sizeof (char) * (string_side + 1));init_queue(&queue, string_side); //初始化队列init_stack(&stack, string_side); //初始化栈enter_queue(&queue, string_get, string_side);out_queue(&queue, string_queue, string_side);push(&stack, string_get, string_side);pop(&stack, string_stack, string_side);contrast(string_stack, string_queue, string_side);}3. 接收字符串函数get_string ()void get_string(char *string_get, int *qString_side) //接收字符串{int string_side;printf("请输入要判断的字符串\n");scanf("%s", string_get);string_side = *qString_side = strlen(string_get);//判断字符串长度printf("输入的字符串长度为%d\n", string_side);}4. 初始化队列函数init_queue ()void init_queue(SeqQueue *queue, int string_side) //初始化队列 {queue->pBase_queue = (char *)malloc(sizeof (char) *(string_side + 1));queue->front = 0;queue->rear = 0;}5. 初始化栈函数init_stack ()void init_stack(SeqStack *stack, int string_side) //初始化栈 {stack->pBase_stack = (char *)malloc(sizeof (char) *(string_side + 1));stack->bottom = -1;stack->top = -1;}6. 入队函数enter_queue ()void enter_queue(SeqQueue *queue, char *string_get, intstring_side) //入队{int i = 0;while((queue->rear+1) % (string_side + 1) != queue->front) //队列满时跳出循环{queue->pBase_queue[queue->rear] = string_get[i]; //依次在队列里添加字符queue->rear = (queue->rear + 1) % (string_side + 1); //循环队列i++;}}7. 出队函数out_queue()void out_queue(SeqQueue *queue, char *string_queue, intstring_side) //出队{int i = 0;while(queue->rear != queue->front) //当队列空时跳出循环{string_queue[i] = queue->pBase_queue[queue->front]; //依次取出队列里字符queue->front = (queue->front + 1) % (string_side + 1);//循环队列i++;}string_queue[i] = '\0'; //字符串结束printf("顺序输出为:");printf("%s\n",string_queue);}8. 压栈函数push ()void push(SeqStack *stack, char *string_get, int string_side) //压栈{int i = 0;while(string_side--){stack->top++; //top指针先后移一位stack->pBase_stack[stack->top] = string_get[i];//一次在栈里添加字符i++;}}9. 出栈函数 pop()void pop(SeqStack *stack, char *string_stack, int string_side) //出栈{int i = 0;while(stack->top != stack->bottom) //栈空时跳出循环{string_stack[i] = stack->pBase_stack[stack->top];//依次取出栈里字符stack->top--; //top指针前移一位i++;}string_stack[i] = '\0'; //字符串结束printf("逆序输出为:");printf("%s\n",string_stack);}10. 字符串比较函数contrast()void contrast(char *string_stack, char *string_queue, int string_side) //字符串比较{int i, k;for(k = 0; k{if(string_stack[k] == string_queue[k]) //字符串中各个元素依次比较i = 1;else{i = 0;break; //只要有一个不同就跳出循环}}if(i)printf("输入字符串是回文\n");elseprintf("输入字符串不是回文\n");}五、测试结果1. 当输入回文字符串时,有如下结果:2. 当输入不是回文字符串时,结果如下:六、总结反思拿到题目时,想到总体思路是让字符串正序和逆序比较。
回文
9 / 12
4-2
void push(Stack & s,char str) //入栈 { *s.top=str; ++s.top; } char pop(Stack & s,char &str) //出栈 { str=*--s.top; return str; }
10 / 12
tack s; //创建一个对象 ChuStack(s); //通过一个函数来初始化一个栈 SqQueue *q; // 创建一个列队的对象 InitQueue(q); //初始化一个列队 char a[CHARSIZE],str;//定义一个字符数组 int k,m,num=0; / /定义几个int型变量 cout<<"请输入一串字符串!"<<endl; cin>>a; k=strlen(a); //确定输入的字符的长度
22 / 12
实验结果
23 / 12
总结
通过此次任务,首先学会了队列和 栈的定义及其相关操作,其次了解栈和队 列区别,在次通过此次任务也加深了对上 次任务中的栈的理解,最后就是提升了自 我的编程能力与理解能力,在编程过程中 会遇到许多问题比如一开始所输入的字符 串中要用字符'#'来作为字符输入结束的标 志,最后查阅相关资料后解决了此问题。 总之,用数组的方法最简单,栈次之, 但是无论用哪种方法,其解题思路是不变 的。
03
3.1 3.2
对列
队列:另一种限定存取位置的线性表 特点:先进先出(First In/ Firs Out)),只用允许在表的一端插入,在另一端删除 对头(front):允许删除的一端
队尾(rear):允许插入的一端;
数据结构-回文序列判断
201100834218 软件112王云飞一、实验目的1、熟悉并掌握栈的的创建、入栈和出栈等基本用法并能运用栈完成一些特定的任务。
2、熟悉并掌握队列的的创建、入队和出队等基本用法并能运用队列完成一些特定的任务。
3、运用栈和队列实现对“回文”序列的判断。
二、实验内容编写一个算法,判断一次读入一个以@结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’。
且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属于该模式的字符序列,‘a+b&b-a’则不是。
三、数据结构及算法思想运用栈和队列算法,在序列依次输入时将序列分别入栈和入队列,利用栈FILO和队列FIFO的特点,通过出栈和出队列实现序列顺序和逆序的比较,根据题目描述的回文序列判断并输出结果。
四、模块划分1、对各个模块进行功能的描述本次设计共分为六个模块,分别是:初始化模块、输入模块、入栈模块、入队模块、判断模块、输出模块。
各个模块功能如下表。
2、模块之间关系及其相互调用的图示图1五、详细设计及运行结果1、设计源代码:#include"stdio.h"#include"conio.h"#include"malloc.h"typedef struct NODE{char data;struct NODE *next;}LinkStack;typedef struct Node{char data;struct Node *next;}LinkQueueNode;typedef struct{LinkQueueNode *front;LinkQueueNode *rear;}LinkQueue;void InitStack(LinkStack *top){top->next=NULL;}char Push(LinkStack *top,char a){LinkStack *temp;temp=(LinkStack *)malloc(sizeof(LinkStack));if(temp==NULL)return(0);temp->data=a;temp->next=top->next;top->next=temp;return(1);}char Pop(LinkStack *top){LinkStack *temp;char a;temp=top->next;if(temp==NULL)return(0);top->next=temp->next;a=temp->data;free(temp);return(a);}int LengthStack(LinkStack *top){LinkStack *temp;int count=0;temp=top->next;while(temp!=NULL){count++;temp=temp->next;}return(count);}void InitQueue(LinkQueue *q){q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));q->rear=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));q->rear=q->front;q->front->next=NULL;}char EnterQueue(LinkQueue *q,char a){LinkQueueNode *NewNode;NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));if(NewNode!=NULL){NewNode->data=a;NewNode->next=NULL;q->rear->next=NewNode;q->rear=NewNode;return(1);}elsereturn(0);}char OutQueue(LinkQueue *q){LinkQueueNode *temp;char a;if(q->rear==q->front)return(0);temp=q->front->next;q->front->next=temp->next;if(q->rear==temp)q->rear=q->front;a=temp->data;free(temp);return(a);}void main(){char a[100],flag1=0,flag2=0,n,m;int i=0,t=0;LinkStack *top=(LinkStack *)malloc(sizeof(LinkStack));LinkQueue *q=(LinkQueue *)malloc(sizeof(LinkQueue));InitStack(top);InitQueue(q);printf("please input a string end of @ :\n");while(a[i-1]!=64){scanf("%c",&a[i]);i++;}for(t=0;t<i;t++){if(a[t]!=64){Push(top,a[t]);EnterQueue(q,a[t]);}}t=LengthStack(top);if(t%2==0)printf("Input wrong!");else{for(i=0;i<t;i++){n=Pop(top);m=OutQueue(q);if(n!=m)flag1=1;if((i==t/2)&&(n!=38))flag2=1;}if(flag1||flag2)printf("This is not palindrome sequence!");elseprintf("This is palindrome sequence!");}getch();}2、运行结果:2.1、回文字符序列输入:图 22.2非回文字符序列输入:图 3六、调试情况,设计技巧及体会通过这次数据结构试验,我学习了链栈的建立及其一些基本的操作方法和队列的建立及对其的一些基本操作,充分理解了栈和区别和联系,栈和队列都可以通过链表实现,区别在于对其操作的节点位置不同,更重要的是通过这次实践操作学会了完成一个设计的基本方法和步骤,拿到一个问题不能急于开始书写代码要将问题理清楚、找清思路、分好模块再开始敲代码,代码只是实现一个功能的工具,只有好的解决问题的思路,才能做出好的程序。
《阅读材料 栈和队列的应用——回文数的判断》作业设计方案-初中信息技术浙教版20七年级下册自编模拟
《栈和队列的应用——回文数的判断》作业设计方案(第一课时)一、作业目标:通过本作业,学生应能:1. 理解和掌握栈和队列的基本概念和应用;2. 能够运用栈和队列的基本操作(入栈、出栈、入队、出队)来判断一个数是否为回文数;3. 培养独立思考和解决问题的能力。
二、作业内容:1. 基础练习:a. 写出以下代码的栈和队列的基本操作(使用Python语言):* 初始化栈和队列* 入栈(队)* 出栈(队)* 判断栈(队)是否为空* 打印栈(队)中的所有元素b. 编写一个程序,输入一个整数,判断该数是否为回文数。
c. 使用Python实现一个简单的栈和队列数据结构,并使用它们来判断一个数是否为回文数。
2. 提高挑战:a. 编写一个程序,实现两个栈(或队列)的比较和交换元素,判断是否有相同的元素存在。
请注意栈的顺序操作的特点。
b. 在判断回文数程序的基础上,添加输入整数类型的校验(例如整数输入必须为正整数)。
3. 拓展创新:在编程过程中尝试实现更多栈和队列的应用,例如两个队列合并等操作,同时要考虑性能和代码简洁度。
三、作业要求:1. 按照课本知识和给出的代码示例,自行理解和实现相关的栈和队列操作;2. 独立完成作业,不要抄袭或使用其他方式获取答案;3. 遇到问题时,可以向老师或同学请教,寻求帮助;4. 提交作业时,请附上相关的代码和说明文档。
四、作业评价:1. 根据学生提交的作业,检查学生是否正确实现了栈和队列的基本操作;2. 评估学生编写的回文数判断程序是否正确,是否符合输入类型的要求;3. 根据学生作业中的问题和反馈,给予针对性的指导和建议;4. 对于优秀的作业,给予表扬和鼓励,激励学生的学习积极性。
五、作业反馈:1. 在完成作业后,学生应主动检查自己的代码是否有错误或遗漏;2. 如有疑问,应在向老师或同学请教后尽快解决;3. 如果遇到困难无法解决,请及时向老师求助,寻求帮助和支持;4. 请在提交作业后关注老师的评价和反馈,了解自己的学习状况,并在今后的学习中加以改进。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈和队列
一、实验目的
1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。
2、掌握栈和队列的特点,即后进先出和先进先出的原则。
3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队
等运算在顺序存储结构和链式存储结构上的实现。
二、实验内容
1.请简述栈的基本特性和栈的几种基本操作的机制
栈是限定仅在表位进行插入或删除操作的线性表,栈的修改是按照后进先出的原则进行的,根据这种特性进行回文判断。
[问题描述]
对于一个从键盘输入的字符串,判断其是否为回文。
回文即正反序相同。
如“abba”是回文,而“abab”不是回文。
[基本要求]
(1)数据从键盘读入;
(2)输出要判断的字符串;
(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“该字符串是回文”,否则输出“该字符串不是回文”。
[测试数据]
由学生任意指定。
2.设计简单的程序实现用栈判断回文
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
void InitStack(SqStack &S){
S.base =(char *)malloc(STACK_INIT_SIZE * sizeof(char));
if(!S.base)exit(0);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
void Push(SqStack &S,char e){
if(S.top - S.base >= S.stacksize){
S.base = (char *) realloc (S.base,(S.stacksize + STACKINCREMENT) * sizeof(char));
if(!S.base) printf("存储分配失败!");
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
}
char Pop(SqStack &S,char &e){
if(S.top == S.base) {
printf("该栈为空!");
printf("\n");
e = 'E';
}else{
e = *--S.top;
}
return e;
}
void main(){
SqStack S;
InitStack(S);
char a[30];
char c;
char e;
int k = 0;
printf("请输入要转换的字符串,以#号结束:\n");
for(int i = 0;i < 30;i++){
scanf("%c",&c);
if(c != '#'){
a[i] = c;
}else{
k = i;
break;
}
}
for(int h = 0 ; h < k;h++){
Push(S,a[h]);
}
int g = 0; //定义一个计数器
for(int w = 0;w < k;w++){
char x = Pop(S,e);
printf("%c",x);
if(a[w] == x){//比较数组中的第w个值与栈中返回的第w个值是否相等 g++; //若相等的话,计数器加一
}
}
printf("\n");
if(g == k){ //判断计数器的值与输入的数值是否相等
printf("YES");//相等的话打印出YES
}else{
printf("NO");//否则打印出NO
}
printf("\n");
}运行结果如下图:
1.输入字符为回文字符
2.输入字符不是回文字符
三、编程并上机调试运行
四、时间、地点
五、指导教师
(在书写过程中若出现错误,望老师指出,谢谢)。