数据结构源程序 栈、队列和串

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个字符构成的有限序列,其可表示如下:

'a 1,a 2,···,a 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;
}

//待更新

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值