数据结构C语言版栈和队列的应用编程Word文档格式.docx
- 文档编号:21831937
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:19
- 大小:165.95KB
数据结构C语言版栈和队列的应用编程Word文档格式.docx
《数据结构C语言版栈和队列的应用编程Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版栈和队列的应用编程Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
typedefstruct{char*base;
//定义括号匹配的结构体
char*top;
charsize;
}Stack;
typedefstructQNode//队列的链式存储结构
intdata;
structQNode*next;
}QNode,*QueuePtr;
typedefstructLinkQueue
QueuePtrfront;
//对头指针
QueuePtrrear;
//队尾指针
}LinkQueue;
//单链队列
intInitStack(SqStack&
S)//构造一个空栈S
if(!
(S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int))))
exit(0);
//存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return1;
}
voidcreatstack(Stack&
W)//括号匹配顺序栈的建立
W.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
//系统自动生成一结点
W.top=W.base;
W.size=STACK_INIT_SIZE;
printf("
括号匹配空栈已成功创建!
\n"
);
intStackEmpty(SqStackS)
{//若栈S为空栈,则返回1,否则返回0
if(S.base==S.top)
else
return0;
intPush(SqStack&
S,inte)//入栈插入元素e为新的栈顶元素
if(S.top-S.base>
=S.stacksize)//栈满,追加存储空间
{
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
S.base)
//存储分配失败
S.top=S.base+STACKINCREMENT;
}
*(S.top)++=e;
voidPush(Stack&
W,chare)//括号匹配进栈
if((W.top-W.base)>
=W.size)
{
W.base=(char*)realloc(W.base,(W.size+STACK_INIT_SIZE)*sizeof(char));
W.top=W.base+W.size;
W.size+=STACK_INIT_SIZE;
*(W.top++)=e;
intPop(SqStack&
S,int&
e)//出栈
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;
否则返回0
if(S.top==S.base)
e=*--S.top;
voidPop(Stack&
W,char&
e)//括号匹配出栈
if(W.top==W.base)
ERROR!
e=*(--W.top);
intInitQueue(LinkQueue&
Q)
{//构造一个空队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
Q.front)
//存储分配失败
Q.front->
next=NULL;
intEnQueue(LinkQueue&
Q,inte)
{//插入元素e为Q的新的队尾元素
QueuePtrp;
(p=(QueuePtr)malloc(sizeof(QNode))))//存储分配失败
p->
data=e;
Q.rear->
next=p;
Q.rear=p;
intQueueEmpty(LinkQueueQ)
{//若Q为空队列,则返回1,否则返回0
if(Q.front==Q.rear)
intDeQueue(LinkQueue&
Q,int&
e)
{//若队列不空,删除Q的队头元素,用e返回其值,并返回1,否则返回0
QueuePtrP;
P=Q.front->
next;
e=P->
data;
next=P->
if(Q.rear==P)
Q.rear=Q.front;
free(P);
voidconversionA()
{//对于输入的任意一个非负十进制整数,打印输出与其等值的二进制数
SqStacks;
unsignedn;
//非负整数
SElemTypee;
InitStack(s);
//初始化栈
请输入一个非负十进制整数n:
"
n="
scanf("
%u"
&
n);
//输入非负十进制整数n
printf("
转换的二进制为:
while(n)//当n不等于0
Push(s,n%2);
//入栈n除以2的余数(2进制的低位)
n=n/2;
while(!
StackEmpty(s))//当栈不空
Pop(s,e);
//弹出栈顶元素且赋值给e
%d"
e);
//输出e
voidconversionB()
{//对于输入的任意一个非负10进制整数,打印输出与其等值的8进制数
转换的八进制为:
Push(s,n%8);
//入栈n除以八的余数(八进制的低位)
n=n/8;
voidconversionC()
{//对于输入的任意一个非负10进制整数,打印输出与其等值的16进制数
转换的十六进制为:
Push(s,n%16);
//入栈n除以16的余数(16进制的低位)
n=n/16;
while(!
if(e<
=9)
%c"
e+55);
voidconversionD()
{//对于输入的任意一个2进制整数,打印输出与其等值的10进制数
LinkQueues;
//非负二进制整数
inte;
inti=0;
intk=0;
InitQueue(s);
//初始化队列
请输入一个非负二进制整数n:
//输入非负二进制整数n
转换的十进制为:
EnQueue(s,n%10);
//入队列n除以10的余数
n=n/10;
QueueEmpty(s))//当队列不空
DeQueue(s,e);
//弹出队顶元素且赋值给e
k=k+e*pow(2,i++);
k);
voidconversionE()
{//对于输入的任意一个8进制整数,打印输出与其等值的10进制数
//非负8进制整数
请输入一个非负八进制整数n:
//输入非负8进制整数n
//弹出队顶元素且赋值给e*/
k=k+e*pow(8,i++);
voidconversionF()
{//对于输入的任意一个16进制整数,打印输出与其等值的10进制数
charn[30];
//存取输入的16进制数
intlen,i,j=0,dec=0;
请输入一个非负十六进制整数n:
%s"
n);
len=strlen(n);
for(i=0;
i<
len;
i++)
if(n[i]>
=48&
&
n[i]<
=57||n[i]>
=65&
=70||n[i]>
=97&
=102)
continue;
您必须输入一个十六进制数!
exit(-1);
for(i=len-1;
i>
=0;
i--,j++)
if(n[i]<
=57)
dec=dec+(n[i]-'
0'
)*pow(16,j);
elseif(n[i]<
=70)
dec=dec+(n[i]-55)*pow(16,j);
dec=dec+(n[i]-87)*pow(16,j);
%d\n"
dec);
voidfactorA()
{//数制转换绝对值小于1的十进制小数转换为二进制
inti,j=0,ch[MAX];
/*i为每位上的二进制数,ch为存放二进制数的数组*/
floatnum;
请输入一个绝对值小于1的十进制小数n:
%f"
num);
/*输入要转换的十进制数小数*/
do
i=(int)(num*2);
num=num*2-i;
ch[j++]=i;
while(num);
0."
j;
ch[i]);
voidfactorB()
{//数制转换绝对值小于1的十进制小数转换为八进制
/*i为每位上的八进制数,ch为存放八进制数的数组*/
i=(int)(num*8);
num=num*8-i;
voidBracket(Stack&
W,char*str)//括号匹配
inti=0,flag1=0;
chare;
while(str[i]!
='
\0'
)
switch(str[i])
case'
{'
:
Push(W,'
break;
['
('
}'
{Pop(W,e);
if(e!
)flag1=1;
break;
]'
}
)'
default:
if(flag1)break;
i++;
flag1&
(W.top==W.base))
括号匹配!
elseprintf("
括号不匹配!
voidfit(Stack&
W)//括号匹配函数的实现
creatstack(W);
charstr[200];
请输入字符串:
str);
Bracket(W,str);
intPalindrome_Test()//判别输入的字符串是否回文序列
SqStackS;
LinkQueueQ;
InitStack(S);
InitQueue(Q);
//inti;
//记录次数的变量
charV;
SElemTypeV1,V2;
while((V=getchar())!
@'
)//获取一个字符
Push(S,V);
//将数据插入栈
EnQueue(Q,V);
//插入队列同时使用栈和队列两种结构
while(S.top!
=S.base)
Pop(S,V1);
//出栈
DeQueue(Q,V2);
//出队列
if(V1!
=V2)
return0;
return1;
}//Palindrome_Test
intmain()
intmenu;
StackW;
while
(1)
栈和队列的应用\n"
*****************************************\n"
**1、10-2进制整数转换**\n"
**2、10-8进制整数转换**\n"
**3、10-16进制整数转换**\n"
**4、2-10进制整数转换**\n"
**5、8-10进制整数转换**\n"
**6、16-10进制整数转换**\n"
**7、10-2进制小数转换**\n"
printf("
**8、括号匹配**\n"
**9、回文判断**\n"
**0、退出**\n"
\n请选择相应操作\n"
//选择菜单
menu);
switch(menu)
case1:
conversionA();
//10-2进制整数转换
case2:
conversionB();
//10-8进制整数转换
case3:
conversionC();
//10-16进制整数转换
case4:
conversionD();
//2-10进制整数转换
case5:
conversionE();
//8-10进制整数转换
case6:
conversionF();
//16-10进制整数转换
case7:
factorA();
//10-2进制小数转换
case8:
fit(W);
//括号匹配
case9:
{printf("
请输入要判断的字符串以@作为结束符\n"
if(Palindrome_Test()==1)
是回文\n"
不是回文\n"
case0:
intM;
您是否要退出程序?
1.是2.否\n"
scanf("
M);
if(M==1)
{
printf("
您已退出程序了!
exit(0);
}
实验结果分析:
实验总结:
通过这次实验,我在不断的修改和编写的过程中对数据结构的核心意义更加理解得更为深刻,同时对栈和队列的“入”和“出”形式的理解更为形象化。
由于我的每个子程序都是分开完成的,所以到后来要用一个主程序来实现时遇到了一点小困难,但是在我不断的修改和思考中成功解决了这一问题并且总结了一些很实用的经验。
刚开始做回文判断时我用的只是顺序栈的结构,后来,我想何不利用栈和队列的性质,同时用栈和队列来实现,通过再一次编写,证明这个方法是可行的,所以有了最后的算法实现。
通过实验,掌握了栈与队列的基本操作。
因为整个程序是由我独立完成的,所以有些地方可能稍显不足,希望通过今后的不断学习进步能得到改善。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 队列 应用 编程