顺序栈之判断一个字符串是否是对称串

问题设计:

设计一个算法利用顺序栈判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。

代码实现:

#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
#define MaxSize 60
typedef int ElemType;
typedef struct {
   ElemType data[MaxSize];
   int top;  //栈顶指针
}SqStack;  //定义顺序栈类型
//初始化栈
void InitStack(SqStack *&s){
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top=-1;
}
//销毁栈
void DestroyStack(SqStack *&s){
   free(s);
}
//判空
bool StackEmpty(SqStack *s){
	return(s->top==-1);
}
//进栈
bool Push(SqStack *&s,ElemType e){
	if(s->top==MaxSize-1)  //进栈判满
	   return false;
	s->top++; //指针加一
	s->data[s->top]=e;
	return true;
}
//出栈
bool Pop(SqStack *&s,ElemType &e){
	if(s->top==-1)  //出栈判空
		return false;
	e=s->data[s->top]; //取栈顶元素
	s->top--; //指针减一
	return true;
}
//判断一个字符串是否是对称串
bool symmetry(string str){
   ElemType e;
   SqStack *st;
   InitStack(st);   //初始化栈
   //元素进栈
   for(int i=0;i<str.length();i++){
      Push(st,str[i]);
   }
   //比较栈中元素和字符串
   for(int i=0;i<str.length();i++){
       Pop(st,e); //出栈,e存放的是当前栈顶元素
	   if(e!=str[i]){  //不同
		  DestroyStack(st);  //销毁栈
		  return false;
	   }
   }
   DestroyStack(st);
   return true;
}
int main(){
   string str;
   cin>>str;
   bool flag;
   //判断它是不是对称串
   flag=symmetry(str);
   if(flag)
	   cout<<str<<"是回文串"<<endl;
   else
	   cout<<str<<"不是回文串"<<endl;
}

运行结果:

在这里插入图片描述

### 回答1: 算法如下: 1. 初始化一个空的顺序栈S。 2. 读入字符串str,将其逐个字符压入栈S中。 3. 依次弹出栈S中的字符,将其组成新的字符串rev_str。 4. 判断字符串str和新字符串rev_str是否相等,若相等则为对称,否则不是。 5. 返回判断结果。 代码实现如下: bool isSymmetric(string str) { SeqStack<char> S; for (int i = ; i < str.length(); i++) { S.push(str[i]); } string rev_str = ""; while (!S.isEmpty()) { rev_str += S.pop(); } return str == rev_str; } ### 回答2: 算法描述: 1.先创建一个顺序栈。 2.将字符串的每个字符从到右依次压入栈中。 3.将栈中的字符从顶部到底部依次出栈,组成一个新的字符串。 4.判断字符串和新字符串是否相同,若相同,则原字符串对称算法步骤: 1.将字符串的长度计算出来,并创建一个顺序栈。 2.将字符串的每个字符从到右依次压入栈中。 3.依次从栈中弹出字符,组成一个新的字符串。 4.比较原字符串和新字符串是否相同,若相同,则原字符串对称,反之则不是。 算法分析:算法中使用了顺序栈,时间复杂度为O(N),适合对一个字符串进行判断。 ### 回答3: 对称一个字符串向右读和从右向读都是相同的序列。例如,“level”和“abba”就是对称,而“hello”和“world”则不是。编写一个算法,可以利用顺序栈判断一个字符串是否是对称。 解决这个问题的关键是如何利用顺序栈。我们可以将原始字符串中的每个字符都压入一个顺序栈中。然后在弹出的同时,我们可以将弹出的字符与原始字符串中相应的字符进行比较。如果这两个字符不同,那么我们可以确定这个字符串不是对称,立即返回“不是对称”;否则,我们可以继续弹出下一个字符并继续比较,直到顺序栈为空。如果在这个过程中所有的字符都被成功比较了,那么这个字符串就是对称。 对于这个算法,我们需要一个顺序栈的结构来保存读入的字符串。我们首先初始化一个空栈,然后从字符串端开始读取每个字符,并将其放入栈中。 接下来,我们将字符串中的每个字符从顶部弹出,直到栈为空。在这个过程中,我们将顶端的字符弹出并与原始字符串中相应的字符进行比较。如果这两个字符不相同,那么我们就立即认为这个字符串不是对称,返回“不是对称”;否则,我们可以继续弹出下一个字符并继续比较。如果在这个过程中,所有的字符都被成功比较了,那么这个字符串就是对称。 这个算法的时间复杂度为O(N),其中N是字符串的长度。因为它只需要一次遍历整个字符串,并且最多需要执行N / 2次操作(因为只需要比较一半的字符即可确定是否是对称),所以可以得出这个复杂度的结论。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值