数据结构栈子系统.docx

上传人:b****6 文档编号:7766026 上传时间:2023-01-26 格式:DOCX 页数:11 大小:16.42KB
下载 相关 举报
数据结构栈子系统.docx_第1页
第1页 / 共11页
数据结构栈子系统.docx_第2页
第2页 / 共11页
数据结构栈子系统.docx_第3页
第3页 / 共11页
数据结构栈子系统.docx_第4页
第4页 / 共11页
数据结构栈子系统.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数据结构栈子系统.docx

《数据结构栈子系统.docx》由会员分享,可在线阅读,更多相关《数据结构栈子系统.docx(11页珍藏版)》请在冰豆网上搜索。

数据结构栈子系统.docx

数据结构栈子系统

/*

*题目:

设计一个字符型的链栈。

*编写进栈、出栈、显示栈中全部元素的程序。

*题目:

编写一个把十进制整数转换为二进制数的应用程序

*题目:

编写一个把中缀表达式转换为后缀表达式(逆波兰式)的应用程序

*题目:

设计一个选择式菜单,以菜单方式选择上述操作。

*栈子系统

********************************

**1------进栈*

**2------出栈*

**3------显示*

**4------数值转换*

**5------逆波兰式*

**0------返回*

********************************

*请选择菜单号(0--5):

*/

#include<>

#include<>

#defineSTACKMAX50

typedefstructsta//栈的存储结构

{

intdata;

structsta*next;

}stackNode;

typedefstruct//指向栈顶的指针

{

stackNode*top;

}linkStack;

voidconversion(intn);

voidpush(linkStack*p,intx);

intpop(linkStack*p);

voidshowStack(linkStack*p);

voidsufflx();

/*************************************************

Function:

main()

Description:

主调函数

Calls:

push()

pop()

showStack()

conversion()

Input:

NULL

Return:

void

Others:

NULL

*************************************************/

voidmain()

{

intx,choice,i=1;

linkStackp;

=NULL;//置空栈

while(i)

{

printf("\n栈子系统\n");

printf("*******************************\n");

printf("*1------进栈*\n");

printf("*2------出栈*\n");

printf("*3------显示*\n");

printf("*4------数值转换*\n");

printf("*5------逆波兰式*\n");

printf("*0------返回*\n");

printf("*******************************\n");

printf("请选择菜单号(0--5):

");

fflush(stdin);//清空输入的缓存区

choice=getchar();

switch(choice)

{

case'1':

while

(1)

{

printf("请输入一个整数(‘0’表示结束)并按回车:

");

scanf("%d",&x);

if(x!

=0)

{

push(&p,x);//入栈

}

else

{

break;

}

}

break;

case'2':

x=pop(&p);//出栈

if(x>0)

{

printf("出栈元素为:

%d\n",x);

}

else

{

printf("栈为空,没有元素可以出栈!

\n");

}

break;

case'3':

showStack(&p);//显示栈元素

break;

case'4':

printf("请输入十进制数:

");

scanf("%d",&x);

conversion(x);//数值转换

break;

case'5':

sufflx();

break;

case'0':

i=0;

break;

default:

i=1;

break;

}

}

}

/*************************************************

Function:

conversion()

Description:

十进制数转换二进制数

Calls:

push()

pop()

Input:

n:

输入的要转换的数

Return:

void

Others:

NULL

*************************************************/

voidconversion(intn)

{

linkStacks;

intx,i=1;

=NULL;//置空栈

do

{

x=n%2;//求余数

n=n/2;//求新商

push(&s,x);//入栈

}while(n);

printf("转化的二进制为:

");

while(i)

{

x=pop(&s);//出栈

if(x!

=-1)//判断是否全部出栈

{

printf("%d",x);

}

else

{

i=0;

}

}

printf("\n");

}

voidsufflx()

{

charstr[STACKMAX];//存储中缀表达式

charexp[STACKMAX];//存储后缀表达式

charstark[STACKMAX];//顺序栈来存放运算符

inttop=0;//顺序栈置空

intsum,t,i=0;

charch;

printf("请输入一个算术表达式(运算符只能包含+,-,*,/),以#结束:

\n");

fflush(stdin);

do

{

i++;

scanf("%c",&str[i]);

}while(str[i]!

='#'&&i!

=STACKMAX);//存储用户输入的中缀表达式

sum=i;//保存表达式的长度

i=t=1;

ch=str[i];

i++;

while(ch!

='#')

{

switch(ch)

{

case'(':

//读取到‘(’时,入栈

top++;

stark[top]=ch;

break;

case')':

//读取到‘)’时

while(stark[top]!

='(')

{

exp[t++]=stark[top--];//出栈并赋值给输出数组

exp[t++]=',';//添加分割符号

}

top--;//栈顶元素为‘(’时,出栈

break;

case'+':

//读取到‘+’时

while(top!

=0&&stark[top]!

='(')//判断符号优先级

{

exp[t++]=stark[top--];

exp[t++]=',';

}

stark[++top]=ch;//栈为空时入栈

break;

case'-':

//读取到‘-’时

while(top!

=0&&stark[top]!

='(')

{

exp[t++]=stark[top--];

exp[t++]=',';

}

stark[++top]=ch;//栈为空时入栈

break;

case'*':

//读取到‘*’时

while(stark[top]=='*'||stark[top]=='/')//*、/运算级最高

{

exp[t++]=stark[top--];

exp[t++]=',';

}

stark[++top]=ch;//运算符优先级高的入栈

break;

case'/':

//读取到‘/’时

while(stark[top]=='*'||stark[top]=='/')

{

exp[t++]=stark[top--];

exp[t++]=',';

}

stark[++top]=ch;//运算符优先级高的入栈

break;

case'':

//读取到空格时忽略

break;

default:

//不是运算符号时

while(ch>='0'&&ch<='z')//限制输入的变量

{

exp[t++]=ch;

ch=str[i++];

}

i--;//上面多加的要去掉

exp[t++]=',';

break;

}

ch=str[i++];

}

while(top!

=0)//顺序栈中仍有数值时

{

exp[t++]=stark[top--];

if(top!

=0)

{

exp[t++]=',';

}

}

printf("中缀表达式为:

");//输出

for(i=1;i

{

printf("%c",str[i]);

}

printf("\n后缀表达式为:

");

for(i=1;i

{

printf("%c",exp[i]);

}

}

/*************************************************

Function:

push()

Description:

入栈

Calls:

NULL

Input:

*p:

栈的栈顶指针

x:

要入栈的数

Return:

void

Others:

NULL

*************************************************/

voidpush(linkStack*p,intx)//入栈

{

stackNode*q;

q=(stackNode*)malloc(sizeof(stackNode));

q->data=x;

q->next=p->top;

p->top=q;

}

/*************************************************

Function:

pop()

Description:

出栈

Calls:

NULL

Input:

*p:

栈的栈顶指针

Return:

int

Others:

NULL

*************************************************/

intpop(linkStack*p)//出栈

{

stackNode*q;

intx;

if(p->top!

=NULL)

{

q=p->top;

x=q->data;

p->top=q->next;

free(q);

returnx;//返回栈顶元素

}

else

{

return-1;

}

}

/*************************************************

Function:

showStack()

Description:

显示栈中元素

Calls:

NULL

Input:

*p:

栈的栈顶指针

Return:

void

Others:

NULL

*************************************************/

voidshowStack(linkStack*p)

{

stackNode*q;

q=p->top;

if(q!

=NULL)

{

printf("栈元素为:

");

while(q!

=NULL)

{

printf("%4d",q->data);

q=q->next;

}

printf("\n");

}

else

{

printf("栈为空。

\n");

return;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1