您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

2017-09-25 21:00 453 查看
学会栈的使用(链表构造)(创建,入栈,出栈,置空,判空判满)

#include <iostream>
#include <stdio.h>
#include <malloc.h>

using namespace std;

typedef char ElemType;
typedef struct SNode
{
ElemType Data;
struct SNode *Next;
}*Stack;

//置空栈
void MakeEmpty(Stack PtrS)
{
PtrS->Next = NULL;
}

//创建栈
Stack CreatStack()
{
Stack PtrS;
PtrS = (Stack)malloc(sizeof(struct SNode));
if(PtrS == NULL)
exit(-1);
MakeEmpty(PtrS);
return PtrS;
}

//判空
int IsEmpty(Stack PtrS)
{
return PtrS->Next == NULL;
}

//入栈
void Push(ElemType X, Stack PtrS)
{
Stack p;
p = (Stack)malloc(sizeof(SNode));
p->Data = X;
p->Next = PtrS->Next;
PtrS->Next = p;
}

//出栈(弹出栈顶元素)
ElemType Pop(Stack PtrS)
{
if(!IsEmpty(PtrS))
{
ElemType Topc;
Stack FirstCell = PtrS->Next;
PtrS->Next = FirstCell->Next;
Topc = FirstCell->Data;
free(FirstCell);
return Topc;
}
else
exit(-1);
}

//返回栈顶元素
ElemType Top(Stack PtrS)
{
if(!IsEmpty(PtrS))
return PtrS->Next->Data;
else
return 0;
}

void Trans(ElemType c, Stack PtrS)
{
if(c>=97 && c<=122)
{
cout<<c;
return ;
}
else
{
if(c == '(')
Push(c, PtrS);
else if(c == ')')
{
while(Top(PtrS) != '(')
cout<<Pop(PtrS);
Pop(PtrS);
}
else if(c=='*' || c=='/')
{
if(IsEmpty(PtrS))
{
Push(c, PtrS);
return ;
}
if(Top(PtrS)=='+'||Top(PtrS)=='-'||Top(PtrS)=='(')
Push(c, PtrS);
else
{
while(!IsEmpty(PtrS)||Top(PtrS)!='*'||Top(PtrS)!='/')
cout<<Pop(PtrS);
Push(c, PtrS);
}
}
else if(c=='+' || c=='-')
{
if(IsEmpty(PtrS)||Top(PtrS)=='(')
{
Push(c, PtrS);
return ;
}
else
{
while(!IsEmpty(PtrS)&&Top(PtrS)!='(')
cout<<Pop(PtrS);
Push(c, PtrS);
}
}
}
}

int main()
{
Stack PtrS;
PtrS = CreatStack();
ElemType c[100];
gets(c);
for(int i=0; c[i]!='#'; i++)
{
Trans(c[i], PtrS);
}
while(!IsEmpty(PtrS))
{
cout<<Pop(PtrS);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构
相关文章推荐