数据结构试验四 栈与字符串

来源:互联网 发布:android数据库查看表 编辑:程序博客网 时间:2024/06/05 17:40

头文件1

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;#define MAXSIZE 100typedef int datatype;typedef struct{    datatype  a[MAXSIZE];    int top;}seqstack;/**********************************//*函数名称:init() *//*函数功能:初始化空栈           *//**********************************/void init(seqstack *st){    st->top=0;}/**********************************//*函数名称:empty()  *//*函数功能:判断栈是否为空        *//**********************************/int empty(seqstack *st){    return st->top?0:1;}/**********************************//*函数名称:read()  *//*函数功能:读栈顶元              *//**********************************/datatype read(seqstack *st){    if(empty(st)){        printf("\n栈的空的!\n");        exit(1);    }    else        return st->a[st->top--];}/**********************************//*函数名称:push()  *//*函数功能:进栈                  *//**********************************/void push(seqstack *st,datatype x){    if(st->top==MAXSIZE){        printf("栈满,无法进栈!\n");        exit(1);    }    st->a[st->top++]=x;}/**********************************//*函数名称:pop() *//*函数功能:出栈                  *//**********************************/datatype pop(seqstack *st){    if(st->top==0){        printf("\n顺序栈是空的!\n");        exit(1);    }    return st->a[--st->top];}




/*利用栈,实现十进制整数m到十六进制数的转换功能*//**********************************//*文件名称:lab4_01.cpp           *//**********************************/#include"seqstack.h"void Dto16(int m){    seqstack s;/*定义顺序栈*/    init(&s);    char ch[20]={'0','1','2','3','4','5','6',            '7','8','9','A','B','C','D','E','F'};    printf("十进制数%u对应的十六进制数是:",m);    if(m==0)        s.a[s.top++]=ch[0];    while(m)    {        s.a[s.top++]=ch[m%16];        m/=16;    }    while(!empty(&s))        putchar(s.a[--s.top]);    printf("\n");}int main(){    int m;    printf("请输入待转换的十进制数:\n");    while(scanf("%u",&m)!=EOF)        Dto16(m);    return 0;}



头文件2

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;typedef int datatype;typedef struct node{    datatype data;    struct node *next;}linknode;typedef linknode *linkstack;/**********************************//*函数名称:init()  *//*函数功能:初始化空栈            *//**********************************/linkstack init(){    return NULL;}/**********************************//*函数名称:empty()  *//*函数功能:判断栈是否为空        *//**********************************/int empty(linkstack top){    return top?0:1;}/**********************************//*函数名称:read()  *//*函数功能:读栈顶元               *//**********************************/datatype read(linkstack top){    if(empty(top)){        printf("\n栈的空的!\n");        exit(1);    }    else        return top->data;}/**********************************//*函数名称:push()  *//*函数功能:进栈                   *//**********************************/linkstack push(linkstack top,datatype x){    linkstack p;    p=(linkstack)malloc(sizeof(linknode));    p->data=x;    p->next=top;    top=p;    return top;}/**********************************//*函数名称:pop()  *//*函数功能:出栈                  *//**********************************/linkstack pop(linkstack top){    linkstack p;    if(empty(top)){        printf("\n顺序栈是空的!\n");        exit(1);    }    p=top;    top=top->next;    free(p);    return top;}




/*链式栈结构,实现十进制无符号整数m到十六进制数的转换功能*//**********************************//*文件名称:lab4_02.cpp           *//**********************************/#include"linkstack.h"void Dto16(int m){    linkstack s;    s=init();    char ch[20]={'0','1','2','3','4','5','6',        '7','8','9','A','B','C','D','E','F'};    printf("十进制数%u对应的十六进制数是:",m);    if(!m)        s=push(s,ch[0]);    while(m)    {        s=push(s,ch[m%16]);        m/=16;    }    while(!empty(s))    {        putchar(read(s));        s=pop(s);    }    puts("");}int main(){    unsigned int m;    printf("请输入待转换的十进制数:\n");    while(scanf("%u",&m)!=EOF)        Dto16(m);    return 0;}


头文件4

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;typedef char datatype;typedef struct node{    datatype data;    struct node *next;}linknode;typedef linknode *linkstring;/**********************************//*函数功能:尾插法建立字符单链表  *//**********************************/linkstring creat(){    linkstring head,r,s;    datatype x;    head=r=(linkstring)malloc(sizeof(linknode));    head->next=NULL;    printf("请输入一个字符串(以回车结束):\n");    scanf("%c",&x);    while(x!='\n')    {        s=(linkstring)malloc(sizeof(linknode));        s->data=x;        r->next=s;        r=s;        scanf("%c",&x);    }    r->next=NULL;    return head;}/**********************************//*函数功能:输出字符串            *//**********************************/void print(linkstring head){    linkstring p;    p=head->next;    printf("List is:\n");    while(p)    {        printf("%c",p->data);        p=p->next;    }    printf("\n");}/*释放单链表的内容*/void delList(linkstring head){    linkstring p=head;    while(p)    {        head=p->next;        free(p);        p=head;    }}




/*链式存储结构linksrting.h文件在字符串s中从第i个位置起取长度为len的子串,函数返回子串链表*/#include"linkstring.h"linkstring substring(linkstring s,int i,int len){    int cnt=0;    s=s->next;    while(cnt<i){        s=s->next;        cnt++;    }    cnt=0;    linkstring temp,t1,t2;    temp=t1=(linkstring)malloc(sizeof(linknode));    temp->next=NULL;    while(cnt<len&&s)    {        t2=(linkstring)malloc(sizeof(linknode));        t2->data=s->data;   s=s->next;        t1->next=t2;        t1=t2;        cnt++;    }    t1->next=NULL;    return temp;}int main(){    linkstring str1,str2;    str1=creat();                /*建字符串链表*/    print(str1);    str2=substring(str1,3,5);    /*从第3个位置取长度为5的子串*/    print(str2);                 /*输出子串*/    delList(str1);    delList(str2);    return 0;}




这里需要注意

/*采用带头结点的链表存储在字符串s中删除从第i个位置开始,长度为len的子串*//**********************************//*文件名称:lab4_05.cpp           *//**********************************/#include"linkstring.h"void delstring(linkstring s,int i,int len){    int cnt=0;    linkstring t1=s;    while(cnt<i){        s=s->next;        cnt++;    }    cnt=0;    //注意下面三行    linkstring t2=s;    s=s->next;    linkstring temp=s;    while(cnt<len)    {        s=temp->next;        free(temp);        temp=s;        cnt++;    }    t2->next=s;    s=t1;}int main(){    linkstring str;    str=creat();            /*建字符串链表*/    print(str);    delstring(str,2,3);     /*从第2个位置删除长度为3的子串*/    print(str);    delList(str);    return 0;}




0 0