实验目的及要求:
1. 复习栈的“后进先出”、队列的“先进先出”特性,弄懂栈和队列的顺序及链式存储结构;
2. 掌握顺序栈和链栈的初始化、进栈、出栈、取栈顶等操作; 掌握循环队列初始化、元素入队、出队、判空等操作;
3. 会用利用栈解决括号匹配问题表达式求值等经典应用问题,会用队列解决打印杨辉三角形,输入缓冲区等经典应用问题。
4. 理解字符串结构的概念及与线性表的联系,深刻理解串结构的三种存储结构及其常见基本操作的实现。
5. 能够编程对任一串的存储结构完成基础操作,并能解决常见应用问题的串编程。
实验内容:
任务一:试编写C程序,利用栈结构解决以下应用问题。(以下问题二选一完成即可)
- 输入一串括号包含以下括号种类:(、)、[、]、{、}。试利用顺序栈或链栈检查输入括号序列的匹配情况;
- 输入一个无括号的算术表达式,比如:3*4^2/8+1(^表示幂运算,4^2:表示4的2次方)。试利用顺序栈或链栈完成算术表达式求值,并输出结果值。
任务二:试编写C程序,利用队列结构解决以下应用问题。(以下问题二选一完成即可)
- 试利用链队列结构或循环队列结构完成打印输出杨辉三角形的前7行。(杨辉三角形每行可以左对齐)
- 试利用循环队列结构完成模拟键盘输入缓冲区问题。(问题描述见教材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);
}