20230325

数据结构remake第三天
栈和串

栈的基本操作

#include <stdio.h>
#include <stdlib.h>

typedef int SElemType;
typedef struct SeqStack
{
    SElemType *data;
    int maxlen;
    int top;
}SeqStack;
SeqStack * InitStack(int maxl)
{
    SeqStack *s = (SeqStack*)malloc(sizeof(*s));
    s->data = (int*)(malloc(sizeof(SElemType)* maxl));
    s->top = -1;
    s->maxlen = maxl;
    return s;
}
void DestoryStack(SeqStack*s)
{
    if(s==NULL)
        return ;
    free(s->data);
    free(s);
}
void ClearStack(SeqStack*s)
{
    if(s==NULL)
        return ;
    s->top=-1;
}
int StackisEmpty(SeqStack*s)
{
    if(s==NULL ||s->top ==-1 )
    {
        return 1;
    }
    return 0;
}
int Stacklength(SeqStack *s)
{
    if(s==NULL)
    {
        return 0;
    }
    return s->top +1;
}
int Push(SeqStack *s ,SElemType x)
{
    if(s==NULL ||s->top == s->maxlen -1)
    {
        return 0;
    }
    s->data[++s->top]=x;
    
    if(s->top==s->maxlen -1)
        return 0;
    else
        return 1;
}
int Pop(SeqStack *s,SElemType *e)
{
    if(s==NULL || s->top == -1)
    {
        return 0;
    }
    
    *e = s->data[s->top--];//3
 
    if(s->top == -1)
        return 0;
    else
        return 1;
}
int GetTop(SeqStack *s,SElemType *e)
{
    if(s==NULL || s->top == -1)
    {
        return 0;
    }
    *e = s->data[s->top];
    return 1;
}
int main()
{
    int n,m=1;
    int x;
    scanf("%d",&n);
    
    SeqStack *s= InitStack(n);
 
    while(m)
    {
        scanf("%d",&x);
        m=Push(s,x);
    }
//
//    m=1;
//    while(m)
//    {
//        int a=0;
//        m=Pop(s,&a);
//        printf("%d ",a);
//    }
//
//    printf("\n");
//
//    ClearStack(s);
//    m=StackisEmpty(s);
//
//    if(m==1)
//        printf("栈已清空!\n");
    
    return 0;
}

串/KMP

//
//  fakeKMP.cpp
//  dataStructure
//
//  Created by noobwei on 2023/3/25.
//

#include <stdio.h>


void get_next(char T[],int *next){
    int i,k;
    i=1;k=0;
    next[1]=0;
    while(i<T[0]){
        if(k==0||T[i]==T[k]){
            ++i;
            ++k;
            next[i]=k;
        }
        else{
            k=next[k];
        }
    }
}
int Index_KMP(char S[],char T[],int pos){
    int i=pos;
    int j=1;
    int next[255];
    get_next(T, next);
    while(i<=S[0]&&j<=T[0]){
        if(j==0||S[i]==T[j]){
            ++i;
            ++j;
        }
        else{
            j=next[j];
        }
    }
    if(j>T[0]){
        return i-T[0];
        }
    else{
        return 0;
    }
}

原先next数组仍然包含多余的比较步骤
于是将next()进行改良
在++k下增加

if(T[i]!=T[k])
   nextval[i]=k;
else
   nextval[i]=nextval[k];

其主要思想是在j=next[j]后如果两个位置元素相同即可归为一类,将前者的next数组值赋给后者

posted @ 2023-03-25 17:02  noobwei  阅读(13)  评论(0编辑  收藏  举报