1 栈
(1)栈的定义
栈(stack)是一种特殊的线性表,其插入与删除操作被限定在只能在表尾进行。对于栈来说,表头被称为栈底,表尾被称为栈顶。其特性为后进先出。
(2)相关程序
利用栈的特性实现将十进制数转换为其他进制数据。
顺序存储方式:
/*顺序存储方式实现栈*/
#include<stdio.h>
#define ELEMTYPE int
#define MAXSIZE 100
typedef struct
{
ELEMTYPE data[MAXSIZE];
int top;
}SEQSTACK;
/*将10进制x转换为r进制*/
void transform(unsigned x,unsigned r)
{
SEQSTACK stack, *p;
p=&stack;
p->top=0;
while(x!=0)
{
p->top++;
p->data[p->top]=x%r;
//存储每步的余数
x=x/r;
}
while(p->top!=0)
{
printf("%d",p->data[p->top]);
p->top--;
//自尾端到首端逐个输出
}
printf("\n");
}
int main()
{
unsigned x,r;
printf("please input (x,r):\n");
scanf("%u,%u",&x,&r);
while(x)
{
// x = 0时停止
transform(x,r);
printf("please input (x,r):\n");
scanf("%u,%u",&x,&r);
}
return 0;
}
链式存储方式:
/*链式存储方式实现栈*/
#include<stdio.h>
typedef struct node
{
unsigned data;
struct node *next;
}LINKSTACK;
/*将10进制x转换为r进制*/
void transform(unsigned x,unsigned r)
{
LINKSTACK *p,*top;
top=NULL;
while(x!=0)
{
p=new LINKSTACK;
p->data=x%r;
p->next=top;
//存储每步的余数 ,从尾部生成链表
top=p;
x=x/r;
}
p=top;
printf("RESULT:");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
//自首端到尾端逐个输出
}
printf("\n");
}
int main()
{
unsigned x,r;
printf("please input (x,r):\n");
scanf("%u,%u",&x,&r);
while(x)
{
// x = 0时停止
transform(x,r);
printf("please input (x,r):\n");
scanf("%u,%u",&x,&r);
}
return 0;
}
2 队列
(1)队列的定义
队列特性与栈相反,是一种先进先出的线性表。其只允许在一端插入,另一端删除,分别叫做队尾和队头。
(2)相关程序
循环队列的实现:
/*顺序存储方式实现循环队列*/
#include<stdio.h>
#define ELEMTYPE int
#define MAXSIZE 10
typedef struct
{ ELEMTYPE data[MAXSIZE];
int front,rear;
}SEQQUEUE;
/*队尾添加元素*/
int enqueue(SEQQUEUE *q,ELEMTYPE x)
{
if((q->rear+1)%MAXSIZE==q->front)
{
//此时front恰好在rear前一位
printf("Queue is full. \n");
return 0;
}
else
{
q->rear=(q->rear+1)%MAXSIZE;
//rear和front应满足小于MAXSIZE
q->data[q->rear]=x;
return 1;
}
}
/*删除队列*/
ELEMTYPE delqueue(SEQQUEUE *q)
{
ELEMTYPE val;
if(q->rear==q->front)
{
//此时首尾指向同一位置,队列为空
printf("Queue is empty. \n");
return NULL;
}
q->front=(q->front+1)%MAXSIZE;
val=(q->data)[q->front];
return val;
}
int main()
{
SEQQUEUE q;
int x;
q.front=q.rear=0;
printf("input numbers to the queue(ended with 0): \n");
scanf("%d",&x);
while(x)
{
//输入部分
enqueue(&q,x);
scanf("%d",&x);
}
printf("the queue is like: \n");
while(q.front!= q.rear)
{
//输出部分
printf("%d",delqueue(&q));
}
printf("\n\n");
delqueue(&q);//删除队列
return 0;
}
3 串
(1)串的定义
串(string)是由n个字符构成的有限序列,其可表示如下:
(2)相关程序
串的实现:
#include <stdio.h>
#define MAXSIZE 100
typedef struct
{
char ch[MAXSIZE];
int len;
}SEQSTRING;
/*生成字串*/
SEQSTRING substring(SEQSTRING s,int i,int j)
{
SEQSTRING sub;
int k;
if(i<1||i>s.len||j<0||j>s.len-i+1)
sub.len = 0;
else
{
for(k = 0; k < j; k++)
sub.ch[k] = s.ch[i+k-1];
//一一复制
sub.len = j;
}
return sub;
}
/*串的比较*/
int equal(SEQSTRING s1, SEQSTRING s2)
{
int k;
if(s1.len != s2.len)
return 0;
for(k = 0; k < s1.len; k++)
if(s1.ch[k] != s2.ch[k])break;
//一一匹配,不成功则直接退出
if(k == s1.len)
return 1;
else
return 0;
}
/*串的模式匹配*/
int index(SEQSTRING s, SEQSTRING sub)
{
int i = 0,j = 0;
while(i < s.len&& j < sub.len)
if(s.ch[i] == sub.ch[j])
{i++;j++;}
else
{
i = i-j+2;
j = 0;
}
//以串s的每个元素为起点一一匹配sub
if(j == sub.len)
return i-sub.len;
//返回匹配成功位置
else
return -1;
}
int main()
{
SEQSTRING s,sub,s1,s2;
int j,len,pos;
char c;
s1.len = 0;
s2.len = 0;
s.len = 0;
sub.len = 0;
//输入串
printf("\"s=(ended with #)\"\n");
j = 0;
fflush(stdin);
//清除换行影响
while((c = getchar()) != '#')
{
s.ch[j++] = c;
s.len++;
}
//输出串
printf("the original string:\ns=");
for(j = 0; j<s.len;j++)
printf("%c",s.ch[j]);
printf("\n");
//求字串,输入字串起点和终点
printf("input start position and length of substring(pos.len): \n");
scanf("%d,%d",&pos,&len);
sub = substring(s,pos,len);
printf("the substring:\nsub = ");
for(j = 0; j<sub.len; j++)
printf("%c", sub.ch[j]);
printf("\n");
//判断输入字串是否相等
printf("\"s1=(ended with #)\"\n");//输入串1
j=0;
fflush(stdin);
while((c = getchar()) != '#')
{
s1.ch[j++] = c;
s1.len++;
}
printf("\"s2=(ended with #)\"\n");//输入串2
j = 0;
fflush(stdin);
while((c = getchar()) != '#')
{
s2.ch[j++] = c;
s2.len++;
}
if(equal(s1,s2))
printf("s1 = s2\n");
else
printf("s1 != s2\n");
//模式匹配
printf("input a substring for index: \nsub = ");
j = 0;
sub.len = 0;
fflush(stdin);
while((c = getchar()) != '#')
{
sub.ch[j++] = c;
sub.len++;
}//重新输入串sub
if(index(s,sub) == -1)
printf("not exist");
else
printf("the first position to find sub in s is:%d",index(s,sub));
printf("\n");
return 0;
}
//待更新