/*
利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能。
*/
/**********************************/
/*文件名称:lab4_01.c                 */
/**********************************/
#include "seqstack.h"
/*请将本函数补充完整,并进行测试*/
void Dto16(int m)
{   seqstack s;            /*定义顺序栈*/init(&s);printf("十进制数%u对应的十六进制数是:",m); //%d 输出有符号十进制数  %u 输出无符号十进制数 while (m){    push(&s,m%16);m=m/16;}while (!empty(&s))printf("%x",pop(&s));printf("\n");
}
int main()
{    int m;printf("请输入待转换的十进制数:\n");scanf("%u",&m);Dto16(m);return 0;
}
/*
利用链式栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能。
*/
/**********************************/
/*文件名称:lab4_02.c                 */
/**********************************/
#include "linkstack.h"
/*请将本函数补充完整,并进行测试*/
void Dto16(unsigned int m)
{linkstack s;s=init();printf("十进制数%u对应的十六进制数是:",m);while (m){s=push(s,m%16);m/=16;}while (!empty(s)){printf("%x",read(s));s=pop(s);}printf("\n");
}int main()
{unsigned int m;printf("请输入待转换的十进制数:\n");scanf("%u",&m);Dto16(m);return 0;
}
#include <stdio.h>
#include "stack.h"  /*引入自定义的字符栈结构*/
/**********************/
/* 判断是否为运算符   */
/*********************/
int is_op(char op){switch(op){ case '+':case '-':case '*':case '/':return 1;default:return 0;}}
/****************************/
/*   判断运算符的优先级     */
/****************************/
int priority(char op){switch(op){case '(':return 0;case '+':case '-':return 1;case '*':case '/':return 2;default: return -1;}}/*********************************/
/*中缀表达式,转换为后缀表达式   */
/*********************************/
void postfix(char e[],char f[]){seqstack opst;int i,j;initstack(&opst);push(&opst,'\0');i=j=0;while (e[i]!='\0'){ if ((e[i]>='0' && e[i]<='9') || e[i]=='.')f[j++]=e[i];                     /*数字*/else if (e[i]=='(')                /*左括号*/push(&opst,e[i]);else if (e[i]==')')           /*右括号*/{ while (stacktop(&opst)!='(')f[j++]=pop(&opst);pop(&opst);            /*'('出栈*/}else if (is_op(e[i]))         /* '+ ,-, *, /' */{f[j++]=' ';           /*用空格分开两个操作数*/while (priority(stacktop(&opst))>=priority(e[i]))f[j++]=pop(&opst);push(&opst,e[i]);     /*当前元进栈*/}i++;  /*处理下一元*/}while (!stackempty(&opst))f[j++]=pop(&opst);f[j]='\0';}
/****************************************/
/*    将数字字符串转变成数值            */
/****************************************/
float readnumber(char f[],int *i){float x=0.0;int k=0;while (f[*i]>='0' && f[*i]<='9') /*处理整数部分*/{x=x*10+(f[*i]-'0');(*i)++;}if (f[*i]=='.') /*处理小数部分*/{  (*i)++;while (f[*i]>='0' && f[*i]<='9'){   x=x*10+(f[*i]-'0');(*i)++;k++;}}while (k!=0){       x=x/10.0;k=k-1;}printf("\n*%f*",x);return(x);
}/****************************************/
/*         后缀表达式求值程序           */
/****************************************/
double  evalpost(char f[]){  double   obst[50]; /*操作数栈*/int i=0,top=-1;/*请将本函数补充完整*/float x;while(f[i]!='\0'){if(f[i]>='0'&&f[i]<='9')obst[++top]=readnumber(f,&i);else if(f[i]==' ')i++;else if(f[i]=='+'){x=obst[top--];obst[top]=x+obst[top];i++;}else if(f[i]=='-'){x=obst[top--];obst[top]=x-obst[top];i++;}else if(f[i]=='*'){x=obst[top--];obst[top]=x*obst[top];i++;}else if(f[i]=='/'){x=obst[top--];obst[top]=x/obst[top];i++;}}return obst[top];}/*
主程序:输入中缀表达式,经转换后输出后缀表达式
*/
int main(){char e[50],f[50];int i,j;printf("\n\n请输入中缀表达式:\n");gets(e);postfix(e,f);i=0;printf("\n\n对应的后缀表达式为: [");while (f[i]!='\0')printf("%c",f[i++]);printf("]");printf("\n\n计算结果为 :");printf("\n\n%f",evalpost(f));return 0;
}
/*
已知字符串采用带结点的链式存储结构(详见linksrting.h文件),
请编写函数linkstring substring(linkstring s,int i,int len),
在字符串s中从第i个位置起取长度为len的子串,函数返回子串链表。
*/
#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
linkstring substring(linkstring  s, int i, int len)
{linkstring head,pos=s->next,makenode,newlist;int cnt=0;head=(linkstring)malloc(sizeof(linknode));head->next=NULL;newlist=head;while(pos){if(cnt>=i&&cnt<=i+len-1){makenode=(linkstring)malloc(sizeof(linknode));makenode->data=pos->data,makenode->next=NULL;newlist->next=makenode;newlist=makenode;}if(cnt>=i+len)break;cnt++;pos=pos->next;}return head;}
int main()
{   linkstring str1,str2;str1=creat();                  /*建字符串链表*/print(str1);str2=substring(str1,3,5);    /*测试,从第3个位置开始取长度为5的子串,请自行构造不同测试用例*/print(str2);                   /*输出子串*/delList(str1);delList(str2);return 0;
}
/*
字符串采用带头结点的链表存储,设计算法函数void delstring(linkstring s, int i,int len)
在字符串s中删除从第i个位置开始,长度为len的子串。
*/
/**********************************/
/*文件名称:lab4_05.c                 */
/**********************************/
#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
void delstring(linkstring  s, int i, int len)
{linkstring p,q,r;int k=1;p=s->next;while(k<i&&p)     //查找待删除子串的起始位置{q=p;p=p->next;k++;}if(!p)              //如果s串长度小于i,则无法删除return;else{k=1;while(k<len&&p) //从第i个位置开始查找待删除子串的终点{p=p->next;k++;}if(!p)          //如果s串中i后面的长度小于len,则无法删除return ;else{if(!q)      //如果待删除子串位于s最前面{r=s;s=p->next;}else        //子串位于中间或者后面{r=q->next;q->next=p->next;}p->next=NULL; //待删除子串最后置为空while(r){p=r;r=r->next;free(p);   //逐个释放子串中的结点}}}
}
int main()
{   linkstring str;str=creat();            /*建字符串链表*/print(str);delstring(str,2,3);     /*测试,从第2个位置删除长度为3的子串,请自行构造不同的测试用例  */print(str);               /*输出*/delList(str);return 0;
}
/*
字符串采用带头结点的链表存储,编写函数linkstring index(linkstring s, linkstring t),
查找子串t在主串s中第一次出现的位置,若匹配不成功,则返回NULL。
*/#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
linkstring index(linkstring  s, linkstring t)
{linkstring p,s1,t1;p=s->next;while(p)        //p记录匹配的起点{s1=p;       //s1记录s比较的当前位置t1=t->next; //s2记录t比较的当前位置while(s1&&t1&&s1->data==t1->data){s1=s1->next;t1=t1->next;}if(!t1) return p;   //如果匹配成功,则返回pp=p->next;}return NULL;
}
int main()
{   linkstring s,t,p=NULL;s=creat();                  /*建立主串链表*/t=creat();                    /*建立子串链表*/print(s);print(t);p=index(s,t);if(p)printf("匹配成功,首次匹配成功的位置结点值为%c\n",p->data);elseprintf("匹配不成功!\n");delList(s);delList(t);return 0;
}
/*
利用朴素模式匹配算法,将模式t在主串s中所有出现的位置存储在带头结点的单链表中。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct node
{        int data;struct node *next;
}linknode;
typedef linknode *linklist;
/*朴素模式匹配算法,返回t中s中第一次出现的位置,没找到则返回-1,请将程序补充完整*/
int index(char *s,char *t)
{int m,n,i,j,k;m=strlen(s);n=strlen(t);for(i=0;i<=m-n;i++){k=i;j=0;while(j<n){if(s[k]==t[j]){k++;j++;}elsebreak;}if(j==n)return i;}return -1;
}
/*利用朴素模式匹配算法,将模式t在s中所有出现的位置存储在带头结点的单链表中,请将函数补充完整*/
linklist indexall(char *s,char *t)
{linklist head,p,r;int m,n,i,j,k;head=(linklist)malloc(sizeof(linknode));r=head;m=strlen(s);n=strlen(t);for(i=0;i<=m-n;i++){k=i;j=0;while(j<n){if(s[k]==t[j]){k++;j++;}elsebreak;}if(j==n){p=(linklist)malloc(sizeof(linknode));p->data=i;r->next=p;r=p;}}r->next=NULL;return head;
}
/*输出带头结点的单链表*/
void print(linklist head)
{    linklist p;p=head->next;while(p){    printf("%5d",p->data);p=p->next;}printf("\n");
}
int main()
{    char s[80],t[80];linklist head;printf("请输入主串:\n");gets(s);printf("请输入模式串:\n");gets(t);int k=index(s,t);printf("k=%d",k);head=indexall(s,t);printf("\n[ %s ]在[ %s ]中的位置有:\n",t,s);print(head);return 0;
}
/*编写快速模式匹配KMP算法,请将相关函数补充完整。
*/
#define maxsize 100
typedef struct{char str[maxsize];int length ;
} seqstring;
/*求模式p的next[]值,请将函数补充完整*/
void getnext(seqstring p,int next[])
{int i,j;i=0;j=-1;next[0]=-1;while(i<p.length){if(j==-1||p.str[i]==p.str[j]){++i;++j;next[i]=j;}elsej=next[j];}for(i=0;i<p.length;i++)printf("%3d",next[i]);
}
/*快速模式匹配算法,请将函数补充完整*/
int kmp(seqstring t,seqstring p,int next[])
{int i=0,j=0;while(i<t.length&&j<p.length){if(j==-1||t.str[i]==p.str[j]){i++;j++;}elsej=next[j];}return j==p.length?i-p.length:-1;
}
int  main(){   seqstring t, p;int next[maxsize],pos;printf("请输入主串:\n");gets(t.str);t.length=strlen(t.str);printf("请输入模式串:\n");gets(p.str);p.length=strlen(p.str);getnext(p,next);pos=kmp(t,p,next);printf("\n");printf("%d",pos);return 0;
}

本文地址:http://liuyanzhao.com/3593.html

转载请注明

数据结构实验4-栈与字符串相关推荐

  1. 数据结构 实验三 栈的基本运算

    栈的基本运算 任务一: 顺序栈的基本操作 任务描述: 本关任务:实现顺序栈的基本操作,包括栈的初始化.置空栈.进栈.出栈.判栈空.栈的输出(遍历)等. 相关知识: 为了完成本关任务,你需要掌握: - ...

  2. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  3. sdut 2088 数据结构实验之栈与队列十一:refresh的停车场

    数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  4. sdut 1479 数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  5. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  6. sdut 3333 数据结构实验之栈与队列六:下一较大值(二)

    数据结构实验之栈与队列六:下一较大值(二) Time Limit: 150MS Memory Limit: 8000KB Submit Statistic Discuss Problem Descri ...

  7. sdut-3332 数据结构实验之栈与队列五:下一较大值(一)

    数据结构实验之栈与队列五:下一较大值(一) Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Desc ...

  8. sdut 2134 数据结构实验之栈与队列四:括号匹配

    数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  9. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  10. 数据结构实验之栈四:括号匹配

     数据结构实验之栈四:括号匹配 Description 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. Inp ...

最新文章

  1. java-集合排序,队列,散列表map以及如何遍历
  2. 给参加学术会议的人一些宝贵建议
  3. jedivim加载失败,提示没有支持python3,(markdown也是如此)
  4. Linux centos7 配置java环境变量
  5. 云服务器的协议,云服务器协议
  6. 华为P50系列相机全球首发新技术:告别偏色做到真实原色捕捉
  7. ❤️《小黄鸭调试法》程序员必备技能!!!❤️
  8. 学python能做什么-非计算机专业的人学python能做什么?
  9. 初识AngularJS 之 HelloWorld和数据绑定
  10. java 1.6 jre 下载_jre1.6 64位官方下载
  11. Windows网络连接指示器,NCSI
  12. RXJS Operators
  13. 容联云(第三方短信发送)
  14. 2022-02-15:扫地机器人。 房间(用格栅表示)中有一个扫地机器人。 格栅中的每一个格子有空和障碍物两种可能。 扫地机器人提供4个API,可以向前进,向左转或者向右转。每次转弯90度。 当扫地机
  15. 关于将Java编译过的.class文件打成jar可执行文件/JAR详解
  16. 图像修复 python_用python进行图像修复与去除水印
  17. VUE动态展示表格字段
  18. pyinstaller打包软件失败的真正原因
  19. linux下强制卸载命令,强制删除rpm包的方法
  20. Fabric中PBFT源码解读——Checkpoint机制

热门文章

  1. Android中获取IMEI码及其它相关信息的源码
  2. Recommended System
  3. 小米这样做,我是拒绝的
  4. 信息安全问题频发:四成人讨厌大数据 六成人称微信谣言最多
  5. 非空参数校验的工具类
  6. 推荐一个非常好用的进程管理器
  7. 19.Linux系统管理
  8. 使用QtXlsx读写Excel文件
  9. python模块使用教程详解_python之mock模块基本使用方法详解
  10. mac版本 sadptool_EZParkTools下载-智慧停车维护工具 v1.0 官方版 - 安下载