yznu:数据结构与算法:栈、队列和串操作练习

实验目的及要求:

1. 复习栈的“后进先出”、队列的“先进先出”特性,弄懂栈和队列的顺序及链式存储结构;

2. 掌握顺序栈和链栈的初始化、进栈、出栈、取栈顶等操作; 掌握循环队列初始化、元素入队、出队、判空等操作;

3. 会用利用栈解决括号匹配问题表达式求值等经典应用问题,会用队列解决打印杨辉三角形,输入缓冲区等经典应用问题。

4. 理解字符串结构的概念及与线性表的联系,深刻理解串结构的三种存储结构及其常见基本操作的实现。

5. 能够编程对任一串的存储结构完成基础操作,并能解决常见应用问题的串编程。

实验内容:

任务一:试编写C程序,利用栈结构解决以下应用问题。(以下问题二选一完成即可

  1. 输入一串括号包含以下括号种类:(、)、[、]、{、}。试利用顺序栈链栈检查输入括号序列的匹配情况;
  2. 输入一个无括号的算术表达式,比如:3*4^2/8+1(^表示幂运算,4^2:表示4的2次方)。试利用顺序栈链栈完成算术表达式求值,并输出结果值。

任务二:试编写C程序,利用队列结构解决以下应用问题。(以下问题二选一完成即可

  1. 试利用链队列结构循环队列结构完成打印输出杨辉三角形的前7行。(杨辉三角形每行可以左对齐)
  2. 试利用循环队列结构完成模拟键盘输入缓冲区问题。(问题描述见教材p105,例3.7)

任务三:试编写C程序,建立相应字符串存储结构,并完成相应操作要求(以下问题四选一完成即可

1. 从键盘接受字符输入建立顺序串存储结构,并完成以下操作:①打印输出该字符串,②求串长度、③在串的指定位置处插入一个子串、④在指定位置处删除一个指定长度的子串,⑤在指定位置求指定长度的子串,⑥创建另外一个字符串比较两个串,⑦输入一个模式串进行模式匹配操作。

2. 从键盘接受字符输入建立堆串存储结构,完成模拟简单文本编辑器应用。(参见教材p122).

3. 从键盘接受字符输入建立块连串存储结构,并完成在指定位置插入某个子串,在指定位置删除指定长度子串的操作,并打印输出相应操作的结果。

4. 试编写程序,建立顺序串存储,练习KMP模式匹配

程序代码:

任务一:

#include<stdio.h>

#include<stdlib.h>

struct Stack{

    char *Data;

    int Top;

    int MaxSize;

};

struct Stack *create(int maxsize){

    struct Stack *s;

    s=(struct Stack *)malloc(sizeof(struct Stack));

    s->Data=(char *)malloc(sizeof(char)*maxsize);

    s->Top=-1;

    s->MaxSize=maxsize;

    return s;

}

int isEmpty(struct Stack *s){

    return s->Top==-1;

}

int isFull(struct Stack *s){

    return s->Top==s->MaxSize-1;

}

void push(struct Stack *s,char ch){

    if(isFull(s)){

        printf("Stack is full.\n");

        return;

    }

    s->Data[++s->Top]=ch;

}

char pop(struct Stack *s){

    if(isEmpty(s)){

        return NULL;

    }

    return s->Data[s->Top--];

}

int BracketMatch(char *str,struct Stack *s){

    int i=0;

    char ch;

    while(str[i]!='\0'){

        switch(str[i]){

        case '{':

        case '[':

        case '(':

            push(s,str[i]);

            break;

        case '}':

            ch=pop(s);

            if(ch!='{'){

                return 0;

            }

            break;

        case ']':

            ch=pop(s);

            if(ch!='['){

                return 0;

            }

            break;

        case ')':

            ch=pop(s);

            if(ch!='('){

                return 0;

            }

            break;

        default:;

        }

        i++;

    }

    if(s->Top==-1){

        return 1;

    }else{

        return 0;

    }

}

int main(){

    char str[50];

    scanf("%s",str);

    struct stack *s=create(50);

    int flag=BracketMatch(str,s);

    if(flag){

        printf("Successful match.\n");

    }else{

        printf("Mismatch.");

    }

    return 0;

}

任务二:

#include<stdio.h>

#include<stdlib.h>

#include<stdbool.h>

#include<windows.h>

#define MaxSize 50

typedef int ElemType;

typedef struct

{

    ElemType data[MaxSize];

    int front;

    int rear;

}SeqQueue;

void Menu()

{

    printf("\t打印杨辉三角\n\n");

    printf("     1.打印      2.退出\n\n");

}

void InitQueue(SeqQueue *Q)

{

    Q->front = 0;

    Q->rear = 0;

}

bool EmptyQueue(SeqQueue* Q)

{

    if (Q->front == Q->rear)

        return true;

    else

        return false;

}

bool EnterQueue(SeqQueue* Q, ElemType e)

{

    if ((Q->rear + 1) % MaxSize == Q->front)

        return false;

    Q->data[Q->rear] = e;

    Q->rear = (Q->rear + 1) % MaxSize;

    return true;

}

bool DeleteQueue(SeqQueue* Q, ElemType* e)

{

    if (Q->front == Q->rear)

        return false;

    *e = Q->data[Q->front];

    Q->front = (Q->front + 1) % MaxSize;

    return true;

}

void Print_YHSJ()

{

    SeqQueue Q;

    ElemType e;

    int falg = 1;

    int temp = 0, n, i, j=0, row = 0;

    InitQueue(&Q);

    EnterQueue(&Q, 1);

    printf("请输入打印杨辉三角的行数:\n");

    scanf("%d", &n);

    while (row < n)

    {

        for (i = 0; i < n - row-1; i++)

        {

            printf(" ");

        }

        while (j <= row)

        {

            DeleteQueue(&Q, &e);

            EnterQueue(&Q, e + temp);

            printf("%3d", e);

            temp = e;

            j++;

        }

        j = 0;

        EnterQueue(&Q, temp + 0);

        printf("\n");

        temp = 0;

        row++;

    }

    printf("输入0退出!\n");

    scanf("%d", &falg);

    if (falg == 0)

        return;

}

int main()

{

    int n;

    while (1)

    {

        system("cls");

        Menu();

        printf("请输入相关序号:\n");

        scanf("%d", &n);

        switch (n)

        {

        case 1:

            Print_YHSJ();

            break;

        case 2:

            exit(0);

            break;

        default:

            printf("输入错误!\a");

            Sleep(2000);

            break;

        }

    }

    return 0;

}

任务三:

#include<stdio.h>

#include<string.h>

#define OK 1

#define ERROR 0

#define MAXSIZE 255

typedef int Status;

typedef char ElemType; 

typedef struct

{

    char ch[MAXSIZE+1];

    int next[MAXSIZE+1];

    int nextval[MAXSIZE+1];

    int length;

}S1String;

typedef struct

{

    char ch[MAXSIZE+1];

    int length;

}S2String;

Status Init_S1(S1String &S1)

{

    S1.length=0;

    return OK;

}

Status Init_S2(S2String &S2)

{

    S2.length=0;

    return OK;

}

Status Get_S1_next(S1String &S1)

{

    int i=1;

    S1.next[1]=0;

    int j=0;

    while(i<S1.length)

    {

        if(j==0||S1.ch[i]==S1.ch[j])

        {

            i++;

            j++;

            S1.next[i]=j;

        }

        else

        {

            j=S1.next[j];

        }

    }

    return OK;

}

//求得模式串的nextval

Status Get_S1_nextval(S1String &S1)

{

    int i=1;

    S1.nextval[1]=0;

    int j=0;

    while(i<S1.length)

    {

        if(j==0||S1.ch[i]==S1.ch[j])

        {

            i++;

            j++;

            if(S1.ch[i]!=S1.ch[j])

            {

                S1.nextval[i]=j;

            }

            else

            {

                S1.nextval[i]=S1.nextval[j];

            }

        }

        else

        {

            j=S1.nextval[j];

        }

    }

    return OK;

}

//进行比较求出结果

Status Compare(S1String &S1,S2String &S2)

{

    int i=1;

    int j=1;

    int result;

    result=1;

    while(1)

    {

        if(S1.next[i]==0&&S1.ch[i]!=S2.ch[j])

        {

            j++;

            result=j;

        }

        else

        {

            if(S1.ch[i]==S2.ch[j])                

            {                                     

                i++;

                j++;

            }

            else

            {

                i=S1.next[i];

                result=j-i+1;  

            }

            if(i>S1.length)

            {

                return result; 

            }

        }

    }

}

int main()

{

    char s1[255];

    char s2[255];

    int result;

    S1String S1;

    S2String S2;

    Init_S1(S1);

    Init_S2(S2);

    printf("请输入模式串:");

    scanf("%s",&s1);

    printf("请输入主串:");

    scanf("%s",&s2);

    for(int i=0;i<=strlen(s1)-1;i++)

    {

        S1.ch[i+1]=s1[i];

        S1.length++;

    }

    for(int j=0;j<=strlen(s2)-1;j++)

    {

        S2.ch[j+1]=s2[j];

        S2.length++;

    }

    //求结果

    Get_S1_next(S1);

    Get_S1_nextval(S1);

    result=Compare(S1,S2);

    printf("结果是:%d",result);

}

实验结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值