栈 队列
题目
代码片段
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义符号常量
#define LIST_INIT_SIZE 50
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
// 定义元素类型
typedef int ElemType;
typedef int Status;
#define TRUE 1;
#define FALSE 0;
typedef char SElemType_Sq;
typedef char QElemType_L; //定义了数据的类型
/* 宏定义 */
#define STACK_INIT_SIZE 100 //顺序栈存储空间的初始分配量
#define STACKINCREMENT 10 //顺序栈存储空间的分配增量
typedef struct QNode
{
QElemType_L data;
struct QNode *next;
}QNode;
typedef QNode* QueuePtr;
typedef struct
{
QueuePtr front; //头指针
QueuePtr rear; //尾指针
}LinkQueue; //队列的链式存储表示
typedef struct
{
SElemType_Sq *base; //在栈构造之前和销毁之后,base的值为NULL
SElemType_Sq *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
/函数定义
//构造栈
Status InitStack_Sq(SqStack *S)
{
(*S).base = (SElemType_Sq *)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));
if(!(*S).base)
exit(OVERFLOW);
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}
//判断栈空
Status StackEmpty_Sq(SqStack S)
{
if(S.top == S.base)
return 1;
else
return 0;
}
//取顶
Status GetTop_Sq(SqStack S, SElemType_Sq *e)
{
if(S.top==S.base)
return ERROR;
*e = *(S.top - 1); //并不破坏栈
return OK;
}
//压栈操作
Status Push_Sq(SqStack *S, SElemType_Sq e)
{
if((*S).top-(*S).base>=(*S).stacksize) //栈满,追加存储空间
{
(*S).base = (SElemType_Sq *)realloc((*S).base, ((*S).stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));
if(!(*S).base)
exit(OVERFLOW); //存储分配失败
(*S).top = (*S).base + (*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*(S->top) = e; //进栈先赋值,栈顶指针再自增
(S->top)++;
return OK;
}
//出栈操作
Status Pop_Sq(SqStack *S, SElemType_Sq *e)
{
if((*S).top==(*S).base)
return ERROR;
(*S).top--; //出栈栈顶指针先递减,再赋值
*e = *((*S).top);
return OK;
}
/链表队列的函数
// 初始化链表
Status InitQueue_L(LinkQueue *Q){
(*Q).front = (*Q).rear = (QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front)
exit(OVERFLOW);
(*Q).front->next = NULL;
return OK;
}
//判断链表队列是否为空
Status QueueEmpty_L(LinkQueue Q){
if(Q.front==Q.rear)
return true;
else
return false;
}
//取队列的头部比较
Status GetHead_L(LinkQueue Q, QElemType_L *e){
QueuePtr p;
if(Q.front==Q.rear)
return ERROR;
p = Q.front->next;
*e = p->data;
return OK;
}
//入队
Status EnQueue_L(LinkQueue *Q, QElemType_L e){
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data = e;
p->next = NULL;
(*Q).rear->next = p;
(*Q).rear=p;
return OK;
}
//出队
Status DeQueue_L(LinkQueue *Q, QElemType_L *e){
QueuePtr p;
if((*Q).front==(*Q).rear)
return ERROR;
p = (*Q).front->next;
*e = p->data;
(*Q).front->next = p->next;
if((*Q).rear==p)
(*Q).rear = (*Q).front;
free(p);
return OK;
}
//遍历
void Visit(SElemType_Sq x){
printf("%c",x);
}
Status StackTraverse_Sq(SqStack S){ //遍历不应该破坏栈
SElemType_Sq *p = S.base;
while(p<S.top)
Visit(*p++);
printf("\n");
return OK;
}
void QueueTraverse_L(LinkQueue Q){
QueuePtr p;
p = Q.front->next;
while(p)
{
Visit(p->data);
p = p->next;
}
printf("\n");
}
//主函数
Status judgeit(SqStack &s,LinkQueue &l)
{ char Q,P;
bool yesorno=true;
Pop_Sq(&s,&Q);
// printf("%c",Q); //确定取出的是@
while(!StackEmpty_Sq(s))
{
Pop_Sq(&s,&Q);
DeQueue_L(&l,&P);
if(Q!=P)
{
yesorno=false;
printf("不是回文!");
break;
}
}
DeQueue_L(&l,&P);
if(yesorno && StackEmpty_Sq(s)) //为什么不能加上 &&(&P=="@") 呢?
{
printf("是回文!");
}
}
int main()
{
SqStack s;
LinkQueue l;
InitStack_Sq(&s);
InitQueue_L(&l);
char N;
while(N!='@'){ //在栈和队列里输入字符
scanf("%c", &N);
Push_Sq(&s, N);
EnQueue_L(&l, N);
}
// StackTraverse_Sq(s);
// QueueTraverse_L(l);
judgeit(s,l);
}
结果: