栈和队列的应用之回文数判断

2023-05-16

题目:

        采用栈和队列的方法检测并输出一个单词是否为回文。

代码:


#include<stdio.h>
#include<malloc.h>
#define SIZE 20  
using namespace std;
 

//1.定义顺序栈
typedef struct{
	char c[SIZE];//记录字符
	int top;//栈指针
}Stack;
 
//初始化栈
void initStack(Stack &S){
	S.top=-1;//初始化指针
}
 
//入栈
void push(Stack &S,char c){
	S.top++;//指针上移
	S.c[S.top]=c;//存储数据
} 
 
//出栈
void pop(Stack &S,char &c){
	c=S.c[S.top];
	S.top--;//指针下移 
} 
 
//2.定义循环队列
typedef struct{
	char *base;
	int front;
	int rear; 
} Queue;
 
//初始化队列
void initQueue(Queue &Q){
	Q.base=(char *)malloc(SIZE*sizeof(char));//动态分配队列存储空间 
	Q.front=Q.rear=0;//空队列
}
 
//入队列
void inQueue(Queue &Q,char c){
	Q.base[Q.rear]=c;//存储数据
	Q.rear=(Q.rear+1)%SIZE;//队尾指针后移
}
 
//出队列
void outQueue(Queue &Q,char &c){
	c=Q.base[Q.front];
	Q.front=(Q.front+1)%SIZE;//队头指针后移
}
 
//3.偶数个字符比较 
bool evenNumbers(Stack &S,Queue &Q,char &c){
	while(emptyStack(S)&&emptyQueue(Q)){
		if(S.c[S.top]!=Q.base[Q.front]){
			printf("不是回文!\n");
			return false;//返回false,结束循环 
		}else{
			pop(S,c);//出栈
			outQueue(Q,c);//出队列
		}
	}
	return true;
}
 
//主函数
int main(){
	Stack S;
	initStack(S);
	//定义、初始化循环队列 
	Queue Q; 
	initQueue(Q);
	char c;
	int count=0;
	printf("请输入单词,长度小于20: ");
	while((c=getchar())!='\n') { //循环读取字符并判断类型,以末尾换行符’\n’结束
		push(S,c);//入顺序栈
		inQueue(Q,c);//入队列 
		count++;
	}
	if(count>2) { 
		bool yes;  
		if(count%2==0){ 
			yes=evenNumbers(S,Q,c);
		}else{  
			yes=oddNumber(S,Q,c,count);
		}
		if(yes){printf("是回文单词!\n");}
	}else{
		printf("***单词字符个数少于3个无法判断是否为 回文***\n");
	}
	return 0;
}

效果图:

 

思考:

        中文回文如何判断呢?废话不多说,直接上代码:

代码:

#include <iostream>
#include <string.h>
using namespace std;
struct Stack{
    char data[100];
    int top;
};

int Test(Stack L,int lens,string a){
    int n;
    int x = lens/2;
    if(x%2 == 1){
        for(int i=0;i<lens/2-1;i++){
            L.data[L.top] = a[i];
            L.top++;
        }
    }else{
        for(int i=0;i<lens/2;i++){
            L.data[L.top] = a[i];
            L.top++;
        }
    }
    return 1;
}

int main(int argc, char **argv) {
    printf("请输入中文语句:\n");
    char str[100];
    gets(str);
    int lens = strlen(str);
    Stack L;
    L.top = 0;
    if(Test(L,lens,str)){
        printf("%s 是回文",str);
    }else{
        printf("%s 不是回文",str);
    }
    return 0;
}

效果图:

 提高篇:

        采用栈和队列方法编程实现统计一篇文档中的所有出现的回文单词。(这里小编建议采用文件的形式读入)

代码:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <iostream>

//队列
typedef char QElemType;
typedef struct {
    QElemType *base;    //指向动态分配的数组中的元素
    int front;
    int rear;
}SqQueue;

//栈
#define MaxSize 200
typedef struct {
    char data[MaxSize];
    int top;
}Stack;

//队列
void InitQueue(SqQueue &Q){
    //构造一个空队列Q
    Q.base = (QElemType *)malloc(sizeof(QElemType)*MaxSize); 
    if(!Q.base) exit(1);   //验证,Q不为空,返回1
    Q.front = Q.rear = 0;
}

void EnQueue(SqQueue &Q, QElemType e){
    //插入的元素e为Q的新的队尾元素
    if((Q.rear+1) % MaxSize == Q.front) exit(1);
    Q.base[Q.rear] = e;
    Q.rear = (Q.rear + 1) % MaxSize;
}

int DeQueue(SqQueue &Q, char &i) {
    //若队列不空,则删除Q的队头元素,并用i接收队头元素
    if(Q.front == Q.rear)
        exit(1);
    i = Q.base[Q.front];
    Q.front = (Q.front+1) % MaxSize;
}

//栈
void InitStack(Stack &stack){
    stack.top = -1;
}

int push(Stack &S, char x) /*将x置入S栈新栈顶*/
{
    if(S.top == MaxSize -1)
        return false;
    else{
        S.top++;
        S.data[S.top]=x;
        return true;
    }
}

int pop(Stack &S, char &x)  /*将栈S的栈顶元素弹出,放到x中*/
{
    if(S.top==-1)
        return false;
    else{
        x = S.data[S.top];
        S.top--;
        return true;
    }
}

int compare(char a, char b){
    if (a == b) return 0;
    else return 1;
}

效果图:

 有问题也可以和小编一起交流!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈和队列的应用之回文数判断 的相关文章

  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span
  • git的命令总结

    先把清单列出来git cheat sheet git 命令总结 git的init和git clonegit add和git commit 提交二连git checkout 反向操作git reset 回退HEAD指针git revert 同
  • 宏定义中的可变参数 __VA_ARGS__ 用法 与 #和##的用法

    首先了解一下可变参数 span class token macro property span class token directive keyword include span span class token string lt st
  • C++结构体简单链表原理解释

    对结构体简单链表原理的简单解释 xff0c 程序如下 xff1a struct lianbiao int no string name struct lianbiao next lianbiao head 61 nullptr tail 6
  • linux小连招

    Linux命令目录 查看当前shell的种类find命令查找文件 查看当前shell的种类 查看当前发行版可以使用的shell xff1a chao 64 chao span class token function cat span et
  • 侵略性奶牛(对于二分的总结)

    题目 Farmer John has built a new long barn with N 2 lt 61 N lt 61 100 000 stalls The stalls are located along a straight l
  • To Fill or Not to Fill(贪心算法)

    题目描述 有了高速公路 xff0c 开车从杭州到任何其他城市都很容易 但由于汽车的油箱容量有限 xff0c 我们必须不时地在路上找到加油站 不同的加油站可能会给出不同的价格 你被要求仔细设计最便宜的路线去 输入描述 对于每个测试实例 第一行
  • cmake语法

    目录 基本语法命令行projectadd executabletarget sourcessetfileadd librarymessagetarget link librariestarget include directoriesfin
  • 《C++个人学习笔记》使用cout或cin显示未定义标识符

    在vs自动生成的c 43 43 项目中 xff0c 初次使用cout或cin报未定义标识符错误 xff0c 是由于未声明命名空间的原因 解决方法 xff1a 在头文件中声明全局命名空间 加入 using namespace std 表示使用
  • rosbag error

    rosbag play 报错 error 1 md5sum span class token punctuation span span class token constant ERROR span span class token pu
  • CMake实践(三)静态库和动态库构建

    本节的任务是 xff1a 建立一个静态库和动态库 xff0c 提供HelloFunc函数供其他程序使用 xff0c HelloFunc函数向终端输出Hello World字符串 安装头文件和共享库 1 准备工作 在 backup cmake
  • checksum算法详细的计算方法、实现思路与python校验验证

    1 checksum是什么 xff1f Checksum xff1a 电脑 总和检验码 xff0c 校验和 在数据处理和数据通信领域中 xff0c 用于校验目的的一组数据项的和 这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串
  • java循环标号

    在Java中 xff0c 要想跳出多重循环 xff0c 可以在外面的循环语句前定义一个标号 xff0c 然后在里层循环体的代码中使用带有标号的break 语句 xff0c 即可跳出外层循环 switch xff08 continue和bre

随机推荐