数据结构C语言队列-回文

合集下载

数据结构(C语言)第3章 栈和队列

数据结构(C语言)第3章 栈和队列

Data Structure
2013-8-6
Page 13
栈的顺序存储(顺序栈)
利用一组地址连续的存储单元依次存放自栈底到栈顶的数 据元素。 结构定义: #define STACK_INIT_SIZE 100; // 存储空间初始分配量 #define STACKINCREMENT 10; // 存储空间分配增量 typedef struct { SElemType *base; // 存储空间基址 SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素位单位 } SqStack;
解决方案2:
顺序栈单向延伸——使用一个数组来存储两个栈
Data Structure 2013-8-6 Page 21
两栈共享空间 两栈共享空间:使用一个数组来存储两个栈,让一个 栈的栈底为该数组的始端,另一个栈的栈底为该数组 的末端,两个栈从各自的端点向中间延伸。
Data Structure
2013-8-6
链栈需要加头结点吗? 链栈不需要附设头结点。
Data Structure
2013-8-6
Page 27
栈的链接存储结构及实现
Data Structure
2013-8-6
Page 11
GetTop(S, &e) 初始条件:栈 S 已存在且非空。 操作结果:用 e 返回S的栈顶元素。 Push(&S, e) 初始条件:栈 S 已存在。 操作结果:插入元素 e 为新的栈顶元素。 Pop(&S, &e) 初始条件:栈 S 已存在且非空。 操作结果:删除 S 的栈顶元素,并用 e 返回其值。
Data Structure

数据结构c语言版课后习题答案完整版

数据结构c语言版课后习题答案完整版

第1章绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。

(1)O(1)(2)O(m*n)(3)O(n2)(4)O(log3n)(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O(n2)(6)O(n)第2章线性表1.选择题babadbcabdcddac2.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemType Max (LinkList L ){if(L->next==NULL) return NULL;pmax=L->next; 法设计题(2)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。

试写一个算法判定给定的字符向量是否为回文。

(提示:将一半字符入栈)?根据提示,算法可设计为:合应用题(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。

(3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。

求:①存放该数组所需多少单元②存放数组第4列所有元素至少需多少单元③数组按行存放时,元素A[7,4]的起始地址是多少④数组按列存放时,元素A[4,7]的起始地址是多少每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。

(1)242 (2)22 (3)s+182 (4)s+142(4)请将香蕉banana用工具 H( )—Head( ),T( )—Tail( )从L中取出。

L=(apple,(orange,(strawberry,(banana)),peach),pear)H(H(T(H(T(H(T(L)))))))(5)写一个算法统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。

C语言之回文数算法

C语言之回文数算法

C语⾔之回⽂数算法“回⽂”是指正读反读都能读通的句⼦。

它是古今中外都有的⼀种修辞⽅式和⽂字游戏,如“我为⼈⼈,⼈⼈为我”等。

在数学中也有这样⼀类数字有这种特征,成为回⽂数(palindrome number)。

设n是⼀随意⾃然数。

若将n的各位数字反向排列所得⾃然数n1与n相等,则称n为⼀回⽂数。

⽐如,若n=1234321,则称n为⼀回⽂数。

但若n=1234567,则n不是回⽂数。

上代码:#include <stdio.h>#define true 1#define false 0int huiwenshu(int n){int p;p=n;int k=0;//将n进⾏倒序后保存在k这个变量中while(p!=0){k=k*10+p%10;p=p/10;}//推断倒序后的结果k 和原来输⼊的数字n 是否相等,相等返回trueif(k==n)return true;elsereturn false;}int main(void){printf("please input number:\n");static int num ;static int ret ;scanf("%d",&num);ret = huiwenshu(num);if(1 == ret)printf("是回⽂数\n");elseprintf("不是回⽂数\n");return 0 ;}执⾏结果:。

《C语言及程序设计》实践参考——回文数

《C语言及程序设计》实践参考——回文数

《C语⾔及程序设计》实践参考——回⽂数返回:【项⽬4-回⽂数】(1)输⼊⼀个正整数,判断其是否为⼀个回⽂数(例1221、12321都是回⽂数,正着看、倒着看,是同⼀个数)。

[参考解答]#include <stdio.h>int main(){int n,m,k;scanf("%d", &n);k=n;m=0; //m将为n的反序数while(k>0){m=m*10+k%10;k=k/10;}if(m==n) //n等于其反序数,则为回⽂数printf("Yes\n");printf("\n");return 0;}(2)输出10000以内的所有回⽂数。

[参考解答]解法1:#include <stdio.h>int main(){int n,m,k;int count=0;for(n=1; n<10000; n++){k=n;m=0; //m将为n的反序数while(k>0){m=m*10+k%10;k=k/10;}if(m==n) //n等于其反序数,则为回⽂数{printf("%d\t", n);count++;if(count%8==0)printf("\n");}}return 0;}解法2:#include <stdio.h>int main(){int m,n;//个位数全是回⽂数for(m=1; m<=9; ++m)printf("%d\t", m);//下⾯凑出所有两位的回⽂数for(m=1; m<=9; ++m)printf("%d\t", m*10+m);//下⾯凑是所有三位的回⽂数for(m=1; m<=9; ++m)for(n=0; n<=9; ++n)printf("%d\t", m*100+n*10+m);//下⾯凑出所有四位的回⽂数for(m=10; m<=99; ++m){n=(m%10)*10+m/10; //n和m⽐,个位、⼗位恰互换 printf("%d\t", m*100+n);}printf("\n");return 0;}。

数据结构(C语言版)严蔚敏课后习题答案

数据结构(C语言版)严蔚敏课后习题答案

数据结构(C语言版)严蔚敏课后习题答案数据结构(C语言版)严蔚敏课后习题答案一、线性表1. 顺序表顺序表是一种存储结构,它将元素顺序存放在一块连续的存储区域中。

C语言中常用数组来实现顺序表。

以下是一些常见题目的解答:题目1:已知顺序表中存储了n个整数,请编写一个算法,将这个顺序表中的所有负数挑选出来,并将它们按照原有顺序存放在新的顺序表中。

解答:```#include <stdio.h>#define MAX_SIZE 100int main() {int A[MAX_SIZE], neg[MAX_SIZE];int n, i, j = 0;printf("Enter the number of elements: ");scanf("%d", &n);printf("Enter the elements: ");for (i = 0; i < n; i++) {scanf("%d", &A[i]);if (A[i] < 0) {neg[j] = A[i];j++;}}printf("Negative numbers: ");for (i = 0; i < j; i++) {printf("%d ", neg[i]);}return 0;}```题目2:假设顺序表A和B中的元素递增有序排列,编写一个算法合并这两个顺序表,并使合并后的顺序表仍然递增有序。

解答:```#include <stdio.h>#define MAX_SIZE 100int main() {int A[MAX_SIZE], B[MAX_SIZE], C[MAX_SIZE * 2]; int m, n, i, j, k;printf("Enter the number of elements in the first list: "); scanf("%d", &m);printf("Enter the elements in increasing order: ");for (i = 0; i < m; i++) {scanf("%d", &A[i]);C[i] = A[i];}printf("Enter the number of elements in the second list: "); scanf("%d", &n);printf("Enter the elements in increasing order: ");for (i = 0; i < n; i++) {scanf("%d", &B[i]);C[m + i] = B[i];}// Merge A and B into Ci = j = k = 0;while (i < m && j < n) { if (A[i] < B[j]) {C[k] = A[i];i++;} else {C[k] = B[j];j++;}k++;}while (i < m) {C[k] = A[i];i++;k++;}while (j < n) {C[k] = B[j];j++;k++;}printf("Merged list in increasing order: ");for (i = 0; i < m + n; i++) {printf("%d ", C[i]);}return 0;}```2. 链表链表是一种动态的数据结构,它通过结点之间的指针联系起来。

数据结构C语言回文判断(运用栈以及队列完成)

数据结构C语言回文判断(运用栈以及队列完成)

数据结构实验报告回文判断班级:学号:学生姓名:指导教师:时间:2015年5月5日1.实验目的:熟悉栈和队列的各项操作,区别栈和队列的操作原理。

2.实验内容:利用栈的操作完成读入的一个以@结尾的字符序列是否是回文序列的判断.回文序列即正读与反读都一样的字符序列;例如:123&321@是;123&4321@、123&312@不是算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为@停止输入,因为要满足特定的要求:序列1&序列2,故设置夜歌标记量falg=1,判断输入的元素个数是否为奇数个,若为偶数个则令flag=0,若为奇数个继续判断栈的中间元素是否为&,若不是则令flag=0,若是,将栈和队列中的元素依次出列,判断是否相等,若不相等则令flag=0,最后将flag的值返回给主函数,若flag被修改为0说明不是回文序列,否则反之!!判断回文序列的流程图:算法实现:(1)void InitStack(SeqStack *s):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作;(2)int push(SeqStack *s,char ch):入栈操作,即给空栈中写入数据;(3)int pop(SeqStack *s,char *x):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序;(4)void InitQuene(LinkQ *q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作;(5)int enter(LinkQ *q,char ch):入队操作,即给空队列中写入数据;(6)int deleteq(LinkQ *q,char *c):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序;(7)int huiwen(SeqStack s,LinkQ q):输入序列并判断所输入的序列是否是回文序列;(8)void main():主函数,用于调用前面的模块,并输出最终的判断结果。

C语言递归实现判断回文数

C语言递归实现判断回文数

C语⾔递归实现判断回⽂数实现算法:定义⼀个全局变量作为字符数组的标识指针,依次对⽐⾸元素和尾元素,如果出现不匹配就返回异常并结束当前运⾏的函数。

递归时改变传⼊长度的数值实现⾸元素和尾元素的⽐较,递归以标识指针和改变后的length相差1为结束。

当前缺陷:⽆法通过只传⼊字符数组进⾏程序判断,必须传⼊字符数组长度、需要定义⼀个全局变量实现代码如下:int i=0; //定义全局变量int fun(char c[] , int length){if(length -1 - i <= 1) return c[i]==c[length-1]; //递归出⼝if(c[i++] == c[length - 1]){ //递归判断fun(c , length -1 ); }else return0;}最初的想法是length-1 == i ,作为递归出⼝,实际发现只能测试出奇数个字符时的情况,因为在字符串长度为奇数时⽐是偶数时多进⾏⼀次递归,所以在字符串长度为偶数时 i 和 length - 1最最多相差1改进⽅法是:考虑到奇数长度时可以不⽤管中间元素,直接当作偶数处理,所以最后的⼀次递归就是以两个数相差1作为结尾,返回⼀个判断多加⼀个参数可以替换全局变量 i ,还能使函数可以多次运⾏全部代码#include<stdio.h>int i=0;int fun(char c[] , int length){if(length -1 - i <= 1) return c[i]==c[length-1];if(c[i++] == c[length - 1]){fun(c , length -1 );}else return0;}int main(void){char c[] = {"bfsba"};if(fun(c , 5)){printf("yes");}else printf("no");}。

数据结构(C语言版)习题解答

数据结构(C语言版)习题解答

数据结构(C语⾔版)习题解答1.3设n是正整数。

试写出下列程序段中⽤记号“△”标注的语句的频度:(2) i=1; k=0;do {△k+=10*i;i++;}while(i<=n-1)当n=1时,执⾏1;当n>=2时,执⾏n-1次;(3)i=1; k=0;do {△k+ = 10*i; i++;}while(i==n);当n=2时,执⾏2次;当n!=2时,执⾏1次;(4) i=1; j=0;while(i+j≤n) {△if(i}执⾏n次;(5) x=n; y=0; //n是不⼩于1的常数while(x>=(y+1)*(y+1)){△y++;}执⾏向下取整)(6) x=91; y=100;while ( y>0 )△if(x>100) { x-=10; y--; }else x++ ;}If语句执⾏100次(7) for( i=0; ifor( j=i; jfor( k=j; k△x+=2;过程:n1n1i0j in(n1)(n2) (n j)6--==++ -=∑∑第⼆章2.3 已知顺序表La中数据元素按⾮递减有序排列。

试写⼀个算法,将元素x插到La的合适位置上,保持该表的有序性。

思路:先判断线性表的存储空间是否满,若满返回Error;否则从后向前先移动数据,找到合适的位置插⼊。

Status Insert_SqList(SqList &La,int x)//把x 插⼊递增有序表La 中{if(La.length==La.listsize) return ERROR;for(i=La.length-1;La.elem[i]>x&&i>=0;i--)La.elem[i+1]=La.elem[i];La.elem[i+1]=x;La.length++;return OK;}//Insert_SqList2.5 试写⼀个算法,实现顺序表的就地逆置,即在原表的存储空间将线性表(a1,a2, ..., an-1,an)逆置为(an,an-1, ..., a2,a1//思路就是两个指⽰变量i,j同时分别从顺序表的开始和结尾处相向改变void reverse(SqList &A)//顺序表的就地逆置{ElemType p;for(i=1,j=A.length;i{//A.elem[i]<->A.elem[j];p=A.elem[i];A.elem[i[=A.elem[j];A.elem[j]=p;}}//reverse2.7 已知线性表L采⽤顺序存储结构存放,对两种不同情况分别写出算法,删除L中多余的元素,使得L中没有重复元素:(1)L中数据元素⽆序排列;(2)L中数据元素⾮递减有序排列。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验课题一:回文(palindrome)是指一个字符串从前面读和从后面读都一样,仅使用若干栈和队列、栈和队列的ADT函数以及若干个int类型和char类型的变量,设计一个算法来判断一个字符串是否为回文。

假设字符串从标准输入设备一次读入一个字符,算法的输出结果为true或者false。

可以用一些字符串测试输出结果,如:
"abcdeabcde","madamimadam" 等
#include <stdio.h>
#include<stdlib.h>
#define m 100
typedef struct
{
char stack[m];
int top;
}stackstru;
typedef struct
{
char queue[m];
int front;
int rear;
}queuestru;
void main()
{
int stinit(stackstru *s); //初始化顺序栈
int stempty(stackstru *s); //判断栈是否为空
int stpush(stackstru *s,char x); //入栈
char stpop(stackstru *s); //出栈
int quinit(queuestru *q); //初始化循环队列
int quempty(queuestru *q); //判断队列是否为空
int enqueue(queuestru *q,char e); //入队
char dequeue(queuestru *q); //出队
char c;
int flag=0;
stackstru *s=(stackstru *)malloc(sizeof(stackstru));
queuestru *q=(queuestru *)malloc(sizeof(queuestru));
stinit(s);
quinit(q);
printf("Input a string:\n");
while((c=getchar())!='!')
{
putchar(c);
stpush(s,c);
enqueue(q,c);
}
printf("\n");
printf("End input!\n");
while(stempty(s))
{
if(stpop(s)==dequeue(q))
{
flag=1;
continue;
}
else
{
flag=0;
break;
}
}
if(flag==1)
printf("This string is palindrome!\n");
else
printf("This string isn't palindrome!\n"); }
int stinit(stackstru *s)
{
s->top=0;
return 1;
} //初始化栈
int stempty(stackstru *s)
{
if(s->top==0)
{
return 0;
}
else
{
return 1;
} //判断栈是否空
int stpush(stackstru *s,char x)
{
if(s->top==m) //栈满
{
printf("The stack is overflow!\n");
return 0;
}
else //栈未满
{
s->top=s->top+1; //栈顶后移
s->stack[s->top]=x; //字符入栈
return 1;
}
} //入栈操作
char stpop(stackstru *s)
{
char y;
if(s->top==0) //栈为空
{
printf("The stack is empty!\n");
return ' '; //返回空格
}
else //栈不为空
{
y=s->stack[s->top]; //取出栈顶元素
s->top=s->top-1; //栈顶指示移动return y;
}
} //出栈操作
int quinit(queuestru *q)
{
q->front=0;
q->rear=0;
return 1;
} //初始化为一个空的循环队列
int quempty(queuestru *q)
{
if(q->front==q->rear) //队头和队尾相等{
return 0;
else
{
return 1;
}
} //判断队列是否为空
int enqueue(queuestru *q,char e)
{
if((q->rear+1)%m==q->front) //队列已满
{
printf("The queue is overflow!\n"); //提示信息
return 0;
}
else
{
q->queue[q->rear]=e; //入队
q->rear=(q->rear+1)%m; //移动队尾指针
return 1;
}
} //入队操作
char dequeue(queuestru *q)
{
char f;
if(q->front==q->rear) //队列为空
{
printf("The queue is empty!\n"); //提示信息
return 0;
}
else
{
f=q->queue[q->front]; //取出队首元素
q->front=(q->front+1)%m; //移动对头指针
return f;
}
} //出队操作。

相关文档
最新文档