使用堆栈判断字符串是否回文

描述:对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。[基本要求](1)数据从键盘读入;(2)输出要判断的字符串;    (3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。

//字符串结束以“?”结尾,C语言版  复制可用

#include <stdio.h>   
#include<stdlib.h>   
#define MAXSIZE 100   


typedef struct //定义栈
 {
  char data[MAXSIZE];   
  int  top;   
}SqStatck;      


bool StatckEmpty(SqStatck *s)        //判断栈是否为空  
{
return (s->top==-1);
}                  
  
bool PushStack(SqStatck *s,char e)  //入栈
{
  if(s->top==MAXSIZE-1)                         
 return false;
  s->top++;
  s->data[s->top]=e;
  return true;
}


char PopStatck(SqStatck *s)        //出栈
{
if(s->top==-1)
return '0';
return s->data[s->top--];
}


typedef struct { //定义队列
 char data[MAXSIZE];
 int  front;
 int  rear;
}Queue;


bool PushQueue(Queue *q,char e)        //入队
{  
  if((q->rear+1)%MAXSIZE==q->front)             
 return false;
  q->rear=(q->rear+1)%MAXSIZE;
  q->data[q->rear]=e;
  return true;
}                       


char PopQueue(Queue *q) //出队
{   
if(q->front==q->rear)
return '0';
q->front=(q->front+1)%MAXSIZE;
char f=q->data[q->front];
return f;
}


int  main()               
{
 SqStatck *s=new SqStatck();
 s->top=-1;
 Queue *q=new Queue();
 q->front=q->rear=0;
 char c;
 bool flag=true;
 printf("输入一个字符串:\n");
 while((c=getchar())!='?')
 {
 PushStack(s,c);
 PushQueue(q,c);
 }
 while(!StatckEmpty(s))
 {
 if(PopStatck(s)!=PopQueue(q))
 {
 flag=false;
 printf("No\n");
 break;
 }
 }
 if(flag)
 printf("Yes\n");
 return 0;
}

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个MIPS汇编函数,用于判断一个字符串是否回文。它使用了递归方法,将字符串拆分成两个子字符串,逐个比较字符是否相同。 ``` # 判断字符串是否回文,输入参数:$sp+4为字符串地址 # 返回值:$sp+8为1表示是回文,为0表示不是回文 # 定义寄存器 .data str_len: .word 0 str_ptr: .word 0 is_palindrome: .word 0 .text .globl palindrome palindrome: # 保存现场 addi $sp, $sp, -12 sw $ra, 8($sp) sw $s0, 4($sp) sw $s1, 0($sp) # 获取字符串长度和地址 lw $s0, 4($sp) jal search lw $s1, str_len lw $s0, str_ptr # 如果字符串长度小于等于1,则是回文 ble $s1, 1, set_true # 比较首尾字符是否相同 lb $t0, ($s0) lb $t1, ($s0+$s1-1) bne $t0, $t1, set_false # 递归比较子串 addi $s0, $s0, 1 addi $s1, $s1, -2 addi $sp, $sp, -4 sw $s1, ($sp) jal palindrome lw $s1, ($sp) addi $sp, $sp, 4 beq $v0, 0, set_false # 设置为回文 set_true: li $v0, 1 sw $v0, is_palindrome j restore_context # 设置为非回文 set_false: li $v0, 0 sw $v0, is_palindrome j restore_context # 恢复现场 restore_context: lw $s1, 0($sp) lw $s0, 4($sp) lw $ra, 8($sp) addi $sp, $sp, 12 jr $ra # 查找字符串长度和地址 # 输入参数:$a0为字符串地址 # 输出参数:str_len和str_ptr全局变量 search: # 保存现场 addi $sp, $sp, -4 sw $s0, ($sp) # 初始化计数器和指针 la $s0, str_len li $s1, 0 sw $s1, ($s0) la $s0, str_ptr move $s1, $a0 sw $s1, ($s0) # 查找字符串长度 loop: lb $t0, ($a0) beqz $t0, end addi $a0, $a0, 1 addi $s1, $s1, 1 b loop end: # 保存字符串长度和地址 la $s0, str_len sw $s1, ($s0) la $s0, str_ptr sw $a0, ($s0) # 恢复现场 lw $s0, ($sp) addi $sp, $sp, 4 jr $ra ``` 使用方法: 1. 将字符串地址压到堆栈中。 2. 使用 `jal palindrome` 调用回文判断函数。 3. 从堆栈中读取返回值,1表示回文,0表示不是回文。 例如,假设字符串地址为 `$a0`,则可以使用以下代码来调用回文判断函数: ``` addi $sp, $sp, -4 sw $a0, ($sp) jal palindrome lw $t0, ($sp) addi $sp, $sp, 4 ``` 最终结果将保存在 `$t0` 寄存器中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值