实验二 栈和队列

一、       实验目的

1.熟悉栈和队列的顺序和链式存储结构

2.掌握栈和队列的基本运算

3.能够利用栈和队列的基本运算完成栈和队列应用的运算

 

二、       实验内容

1.设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。(提示:将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。)(文件夹:判字符串中心对称

//判字符串中心对称的程序代码
#include<stdio.h>
#include<malloc.h>
#include<string.h>
//定义单链表结构类型
typedef char datatype;
typedef struct node
{  datatype data;
   struct node *next;
}linklist;
//定义顺序栈结构类型
const int maxsize=40;
typedef struct
{  datatype elements[maxsize];
   int top;
}stack;


void setnull(stack *&);
int length(linklist*);
void printlink(linklist*);
void create(linklist *&,datatype*);
void push(stack*,datatype);
datatype pop(stack*);
int symmetry(linklist*,stack*);//判字符串是否中心对称的函数声明


void main()
{
linklist *head;
stack *s;
datatype str[80];
gets(str);
create(head,str);
printlink(head);
setnull(s);
if(symmetry(head,s)) printf("字符串\"%s\"中心对称\n",str);
else printf("字符串\"%s\"不是中心对称\n",str);
}


//栈初始化
void setnull(stack *&s)
{
s=(stack*)malloc(sizeof(stack));
s->top=-1;
}


//求单链表长度
int length(linklist*head)
{  linklist *p=head->next;
   int n=0;
   while(p!=NULL){  n++;  p=p->next; }
   return n;
}


//输出单链表
void printlink(linklist*head)
{  linklist *p=head->next;
   while(p!=NULL)
   {  printf("%c",p->data);
      p=p->next;
   }
   printf("\n");
}


//建立具有头结点的单链表
void create(linklist *&head,datatype*str)
{  
   datatype *p=str;
   linklist *s,*r;
   head=(linklist*)malloc(sizeof(linklist));
   r=head;
   while(*p!='\0')
   {  
 s=(linklist*)malloc(sizeof(linklist));
      s->data=*p;
 r->next=s;
 r=s;
 p++;
   }
   r->next=NULL;
}


//顺序栈入栈
void push(stack*s,datatype e)
{
s->top++;
s->elements[s->top]=e;
}


//顺序栈出栈
datatype pop(stack*s)
{
datatype temp;
s->top--;
temp=s->elements[s->top+1];
return temp;
}


//判字符串是否中心对称
int symmetry(linklist* head,stack* s)
{
int n=0;//记录链表的长度,字符的个数
int i=0;
char temp;
int flag=1;//标志位,flag为1表示是回文数,为0不是
n=length(head);
linklist *p;//工作指针
p=head;


for(i=1;i<=n/2;i++)
{
p=p->next;
temp=p->data;
push(s,temp);
}
if(n%2==0) 
{
p=p->next;
}
else if(n%2==1)
{
p=p->next;
p=p->next;
}
while(p!=NULL)
{

if(  (p->data)  == pop(s)  ) ;
else
{
flag=0;
}
p=p->next;


}
return flag;


}


2.假设以数组sequ[m]存放循环队列的元素,同时设变量rear和quelen 分别指示循环队列中队尾元素的位置和内含元素的个数。编写实现该循环队列的入队和出队操作的算法。提示:队空的条件:sq->quelen==0;队满的条件:sq->quelen==m。(文件夹:循环队列

//循环队列入队出队的程序代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//循环队列的结构类型定义
const int m=5;
typedef int datatype;
typedef struct
{   datatype sequ[m];
    int  rear, quelen;
}qu;
void setnull(qu*);
void enqueue(qu*, datatype);
datatype *dequeue(qu*);


void main()
{  qu *sq;
   datatype x, *p;
   int key;
   sq=(qu*)malloc(sizeof(qu));
   setnull(sq);
   do
   {  printf("1.Enter Queue   2.Delete Queue   -1.Quit:");
      scanf("%d",&key);
      switch(key)
      {  case 1:  printf("Enter the Data:"); scanf("%d",&x);
         enqueue(sq,x);  break;
    case 2:  p=dequeue(sq);
         if(p!=NULL) printf("%d\n",*p);
         break;
    case -1: exit(0);
      }
   }while(1);
}


//置空队
void setnull(qu *sq)
{  sq->rear=m-1;
   sq->quelen=0;
}


//入队
void enqueue(qu * sq, datatype x)
{
int i=0;
if(  (sq->quelen) == 5 ) 
{
printf("the queue is full!!\n");


}
else if(  (sq->quelen)<5   )
{
i=sq->quelen;
sq->sequ[i]=x;
sq->quelen=sq->quelen+1;
}
}










//出队
datatype *dequeue(qu * sq )
{
static int front=0;
if(  (sq->quelen ==0 ) ||  (front==5 ) )
{
printf("the queue is empty!\n");
return NULL;
}
else 
{
sq->quelen=sq->quelen-1;
return  &( sq->sequ[front++]);//问题


}

}
//问老师为什么把“问题”行的front++改为单独的语句就不行?

答:return 执行后,后面的语句就不执行了!!郁闷,这么2的问题,幸亏没问


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值