您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法习题汇总(3)

2016-04-13 22:04 579 查看
Q:判断一字符串是否为回文

A:对于这种要求输入和输出相反的情况,一般采用栈来解决,对于此题,只需将正序的字符串压栈再将其全部弹出栈,判断是否相同即可,代码如下:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int status;
typedef char elemtype;
typedef struct stack{
elemtype ch[MAXSIZE];
int top;
}stack;

status visit(elemtype c){
printf("%c ",c);
}

status initstack(stack *S){
S->top=-1;
}

status stacklength(stack *S){
return S->top+1;
}

status push(stack *S,elemtype data){
S->top++;
S->ch[S->top]=data;
}

status pop(stack *S,elemtype data){
data=S->ch[S->top];
S->top--;
}

status createstack(stack *S,elemtype start,elemtype end){
int i=0;
for(i=start;i<end;i++){
S->top++;
S->ch[S->top]=i;
}
}

status createstack2(stack *S,elemtype data){
S->top++;
S->ch[S->top]=data;
}

status traversestack(stack *S){
for(int i=S->top;i>=0;i--){
visit(S->ch[i]);
}
printf("\n");
}

status inversestack(stack *S,stack *S1){
for(int i=S->top;i>=0;i--){
if(S->ch[i]!=S1->ch[i])
return FALSE;
return TRUE;
}
}

int main(void){
stack S,S1;
initstack(&S);
initstack(&S1);
createstack(&S,'a','z');
for(char i='z';i>='a';i--){
push(&S,i);
}
traversestack(&S);
for(int i=S.top;i>=0;i--){
push(&S1,S.ch[i]);
}
traversestack(&S);
if(inversestack(&S,&S1))
printf("回文\n");
else
printf("不是回文\n");
}


Q:借助栈,将单链表逆置

A:再次强调对于要求输入输出相反的题目,首先考虑用栈解决,将链表中所有元素压栈,再弹出栈即可,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define maxsize 40
typedef int status;
typedef int elemtype;

//创建链表
struct node
{
elemtype data;
struct node *next;
}node;
typedef struct sqstack{
elemtype data[maxsize];
elemtype top;
}sqstack;
typedef struct node *linklist;

status visit(elemtype c)
{
printf("%d ",c);
return OK;
}

//初始化链表
status initlist(linklist *l)
{
(*l)=(linklist)malloc(sizeof(node));
if(!(*l))
return ERROR;
(*l)->next=NULL;
return OK;
}

//尾插法
status createlisttail(linklist *l,int n)
{
linklist p=*l,q;
int i;
srand(time(0));
for(i=0;i<n;i++)
{
q=(linklist)malloc(sizeof(node));
q->data=rand()%100;
p->next=q;
p=q;
}
p->next=NULL;
return OK;
}

status traverselist(linklist l)
{
linklist p=l->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
}

//将元素压入栈
status push(sqstack *s,elemtype data)
{
if(s->top==maxsize-1){
return ERROR;//判断栈是否已满
}
else{
s->top++;
s->data[s->top]=data;
}
return OK;
}

//出栈并返回元素值
status pop(sqstack *s){
if(s->top==-1){
return ERROR;
}
else{
elemtype e;
e=s->data[s->top];
printf("%d ",e);
s->top--;
}
return OK;
}

status traversestack(sqstack *s){
int i=0;
for(i=s->top;i>=0;i--){
printf("%d ",s->data[i]);
}
printf("\n");
}

int main(void){
linklist l;
sqstack S;
initlist(&l);
int num;
scanf("%d",&num);
createlisttail(&l,num);
printf("整体创建l的元素(尾插法)\n");
traverselist(l);
linklist pmove=l->next;
while(pmove){
push(&S,pmove->data);
pmove=pmove->next;
}
for(int i=0;i<num;i++){
pop(&S);
}
}


Q;实现双栈共享空间的出入栈算法

A:见拙作《双栈共用存储空间》,不再赘述
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: