栈和队列的应用-回文数判断和括号判断(C语言版)
可以根据用户需求选择回文数判断或者括号判断
代码如下:
//判断回文数
//括号匹配
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ElemType int
#define MAXSIZE 10
//定义队列
typedef struct Queue{
char *base;
int front;
int rear;
}Queue;
//定义链栈节点
typedef struct Node{
char data;//数据域
struct Node *next;//指针域
}Node,*PNode;
//判断是不是回文数
int ispalindromic(Queue q) {
q.rear=strlen(q.base)-1;
while(q.rear-q.front>0){
if(q.base[q.rear]!=q.base[q.front]){
printf("不是回文数\n");
return 0;
}
else{
q.front++;
q.rear--;
}
}
printf("是回文数\n");
}
//入栈
PNode push(PNode s,char a){
PNode p=(PNode )malloc(sizeof(Node));
p->data=a;
p->next=s;
s=p;
return s;
}
//出栈
PNode pop(PNode s){
PNode p;
p=s;
s=s->next;
free(p);
return s;
}
//获取栈顶元素
char gettop(PNode s){
return s->data;
}
//括号匹配
int BracketMatch(Queue q){
PNode l=NULL;;//创建一个栈 存放( [ {
char k;
q.rear=strlen(q.base);
// printf("%d",q.rear);
while(q.front!=q.rear){
if(q.base[q.front]=='('||q.base[q.front]=='['||q.base[q.front]=='{'){
//入栈
l=push(l,q.base[q.front]);
q.front++;
}
else if(q.base[q.front]==')'||q.base[q.front]==']'||q.base[q.front]=='}'){
//获取栈顶元素
k=gettop(l);
if(q.base[q.front]-k==2||q.base[q.front]-k==1){
//出栈
l=pop(l);
}
q.front++;
}
else{
q.front++;
}
}
if(l==NULL){
printf("匹配\n");
}
else{
printf("不匹配\n");
}
}
int main(){
Queue Q;
int k;
Q.base=(char *)malloc(MAXSIZE*sizeof(char));
Q.front=Q.rear=0;
while(1){
printf("1.进行回文数判断\n");
printf("2.进行符号匹配\n");
printf("请输入你的选择\n");
scanf("%d",&k);
switch(k){
case 1:printf("请输入字符串\n");
getchar();//吸收回车
gets(Q.base);
ispalindromic(Q);
break;
case 2:printf("请输入字符串\n");
getchar(); //吸收回车
gets(Q.base);
BracketMatch(Q);
break;
}
}
return 0;
}
若有不足或更好的建议欢迎下方留言评论。