演示堆栈过程Word文档格式.docx
- 文档编号:22921984
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:18
- 大小:18.60KB
演示堆栈过程Word文档格式.docx
《演示堆栈过程Word文档格式.docx》由会员分享,可在线阅读,更多相关《演示堆栈过程Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
voidcaidan();
//显示菜单
voidfun(chara[],charb[]);
//中序转后序函数
intmain(void)
Stacks;
//定义一个栈
charc;
inti;
intnum;
chardata;
//临时保存用户输入的数据
charre_num;
//保存Pop函数的返回值
printf("
**************************************\n"
);
*1—初始化栈*\n"
*2—入栈*\n"
*3—出栈*\n"
*4—遍历栈中元素并显示栈顶元素*\n"
*5—清空栈*\n"
*6—栈的中序转后序*\n"
*7—栈后序表达式的计算*\n"
*8—退出程序*\n"
*9—显示菜单*\n"
while
(1)
{
printf("
请选择你要进行的操作:
"
intk;
scanf("
%d"
&
k);
switch(k)
{
case1:
InitStack(&
s);
break;
case2:
printf("
请输入你准备输入数据的个数:
scanf("
num);
for(i=0;
i<
num;
i++)
{
printf("
第%d个字符:
i+1);
getchar(c);
scanf("
%c"
data);
if(Push(&
s,data))//调用Push函数
{
continue;
}
else
{
printf("
进行进栈操作失败!
\n"
exit(-1);
};
case3:
请输入你准备出出栈的字符个数:
"
if(Empty(&
s))//判断栈是否为空,为空就不能进行出栈操作
printf("
栈已为空!
}
else
{
你去掉的数字是:
for(i=0;
i<
data;
re_num=Pop(&
//调用Pop函数,并把返回值赋给re_num;
%c"
re_num);
};
}
printf("
case4:
TraverseStack(&
case5:
Clear(&
case6:
请输入一个字符串:
%s"
a);
voidfun(chara[],charb[]);
fun(a,b);
\n"
break;
case7:
\t\n请输入后缀表达式:
gets(exp);
//cin.getline(exp,81)//读取后缀表达式
\t\n\n后缀表达式[%s]的结果是:
exp);
while(exp[pos]!
='
\0'
&
&
exp[pos]!
\n'
)//分析表达式字符串
if(isoperator(exp[pos]))//是运算符,取两个操作数
pop(&
operand2);
operand1);
push(getvalue(exp[pos],operand1,operand2));
}
push(exp[pos]-48);
//是操作数,压入操作数栈
pos++;
//移到下一个字符串位置
pop(&
result);
//弹出结果
%d\n"
result);
//输出
case8:
caidan();
case9:
程序结束!
}
return0;
}
//进行栈的初始化的函数
voidInitStack(pStackps)
ps->
Top=(pNode)malloc(sizeof(Node));
//分配内存空间给栈顶
if(NULL==ps->
Top)
动态分配内存失败\n"
exit(-1);
else
Bottom=ps->
Top;
//使栈底也指向栈顶空间
Top->
pNext=NULL;
//栈顶指针置为NULL;
栈已经进行了初始化!
return;
//进行入栈操作的函数
boolPush(pStackps,chardata)
pNodepNew=(pNode)malloc(sizeof(Node));
//定义一个新节点,并分配内存空间
if(NULL==pNew)
returnfalse;
pNew->
member=data;
//把要进栈的数据赋给新节点的member成员
pNext=ps->
//使新节点的指针指向栈顶
Top=pNew;
//把新节点作为新栈顶
returntrue;
//遍历栈的函数
voidTraverseStack(pStackps)
pNodepNew=ps->
if(Empty(ps))//判断栈是否为空,为空就不能进行出栈操作
栈顶元素为:
%c\n"
pNew->
member);
栈内的元素有:
while(pNew!
=ps->
Bottom)//只要栈顶不等于栈底,循环
//打印栈顶的成员member
pNew=pNew->
pNext;
//栈顶指针向下移动一次
//判断栈是否为空
boolEmpty(pStackps)
if(ps->
Top==ps->
Bottom)//栈顶等于栈底,不就是栈中没数据么
//进行出栈操作函数
intPop(pStackps)
pNodepSwap=NULL;
intreturn_val;
\n栈中数据不足无法完整出栈!
return_val=ps->
member;
//把栈顶的成员member的值赋给return_val做为函数返回值
pSwap=ps->
//使pSwap指向栈顶
Top=ps->
//使栈顶指向栈顶下一个节点
free(pSwap);
//释放以前的栈顶空间
returnreturn_val;
//清空栈的函数
voidClear(pStackps)
pNodepNew=NULL;
while(ps->
Top!
Bottom)//栈顶和栈底不等,循环
pNew=ps->
//使一个新节点和栈顶指向同一空间
//使栈顶指向栈顶的下一个节点
free(pNew);
//释放掉以前的栈顶空间
栈已清空!
//显示菜单函数
voidcaidan()
//中序转后序函数
voidfun(chara[],charb[])
{inti,len,j;
len=strlen(a);
j=-1;
for(i=0;
i<
len;
{
switch(a[i])
case'
('
:
stock[++top]='
;
-'
+'
while(top>
=0&
stock[top]!
)
b[++j]=stock[top--];
stock[++top]='
'
stock[++top]=a[i];
break;
*'
/'
)
b[++j]=stock[top--];
stock[++top]='
stock[++top]=a[i];
case'
)'
while(stock[top]!
top--;
default:
b[++j]=a[i];
if(i==len-1)
{
b[++j]='
else
if(a[i+1]<
0'
||a[i+1]>
9'
{
b[++j]='
while(top>
=0)
b[++j]=stock[top--];
b[++j]='
for(i=0;
=j;
i++)
b[i]);
intgetvalue(intop,intoperand1,intoperand2)//计算表达式值
charexp[100];
intoperand1=0;
intoperand2=0;
intresult=0;
intpos=0;
switch((char)op)
case'
return(operand1*operand2);
return(operand1/operand2);
return(operand1+operand2);
return(operand1-operand2);
#include<
ctype.h>
voidPush(intd);
intPop(void);
intvalue;
charstr[100];
do
Entervalue"
gets(str);
if(strcmp(str,"
pop"
)!
=0)
value=atoi(str);
Push(value);
else
valueontopis%d\n"
Pop());
while(strcmp(str,"
quit"
=0);
system("
PAUSE"
#defineMAXSIZE100
intbottomSP=0;
intsp=0;
intstack[MAXSIZE];
voidPush(intd)
sp++;
if(sp>
=(bottomSP+MAXSIZE));
puts("
StackOverflow.\n"
exit
(1);
stack[sp]=d;
intPop(void)
if(sp<
=bottomSP)
Stackunderflow.\n"
returnstack[sp--];
题目:
后缀表达式求值
#include<
structnode//栈结构声明{intdata;
//数据域structnode*next;
//指针域};
typedefstructnodestacklist;
//链表新类型
typedefstacklist*link;
//链表指新针类型
linkoperand=NULL;
//操作数栈指针
voidpush(intvalue)//进栈,存入数据
{linknewnode;
//新结点指针
newnode=newstacklist;
//分配新结点
if(!
newnode)
分配失败!
//存入失败
}
newnode->
data=value;
//创建结点的内容
next=operand;
operand=newnode;
//新结点成为栈的开始
}
voidpop(int*value)//出栈,取出数据{
linktop;
//指向栈顶
if(operand!
=NULL){
top=operand;
operand=operand->
next;
//移动栈顶指针,指向下一个结点
*value=top->
data;
//取数据
deletetop;
//吸收结点
else
*value=-1;
intempty()//判栈空
{《实用数据结构基础》实验报告-3-
if(operand!
=NULL)return1;
elsereturn0;
intisoperator(charop)//判运算符
{
switch(op)
case'
return1;
//是运算符,返回
default:
//不是运算符,返回
intgetvalue(intop,intoperand1,intoperand2)//计算表达式值
switch((char)op)
voidmain()//主函数
//定义操作数
//定义操作结果变量
//目前表达式位置
gets(exp);
//cin.getline(exp,81)//读取后缀表达式
while(exp[pos]!
)//分析表达式字符串
if(isoperator(exp[pos]))//是运算符,取两个操作数
pop(&
push(getvalue(exp[pos],operand1,operand2));
push(exp[pos]-48);
//是操作数,压入操作数栈
pos++;
//移到下一个字符串位置
//弹出结果-4-
//输出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 演示 堆栈 过程