第一次接触数据结构的时候写的,刚开始懵懵懂懂,写得乱七八糟,不过还是写出来了,以下是源代码
//zhan1.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"zhan1.h"
void main()
{
printf(" -----------栈的功能演示:-----------------08/12/5/n");
char m[10]={'a','b','c','d','e','f','g'};
char m1;
int j;
printf("please input the char:/n");
for(j=0;m[j]!='/0';printf(" %c " ,m[j]),j++);
stack T;
printf("/n初始栈T:/n");
Init(&T);
printf("元素入栈T:/n");
j=0;
if(StackEmpty(&T))
{
printf("栈T存在!!/n");
while(m[j]!='/0')
{
Push(&T,m[j]);
j++;
}
printf("元素出栈:/n");
printf("/n栈T长度为:%d",stacklength(&T));
ClearStack(&T);
printf("栈T长度为:%d",stacklength(&T));
printf("/n摧毁栈!!/n");
Destory(&T);
}
else
{
printf("此栈不存在!!");
}
printf("/r/n-----------The simple example for formular evaluation---------08/12/5/n/n");
char formular[25];
char number1[5];
int i=0;
int tag=0; //判断是否是首次执行
int b=0;
int k1=0,k2=0;
int k;
double d=0,h=0; //存表达式出现负数小数情况
char a;
stack L; //临时栈,存暂未被取用的符号
stack S; //存后缀表达式
Init(&L);
Init(&S);
printf("please input formular(The number must less than 10):/n");
gets(formular);
//将中缀表达式转化成后缀表达式
while(formular[i]!='/0')
{
if(is_operator(formular[i]))
{
if(tag==0)Push(&L,formular[i]);
if(formular[i]!=')')
{
Pop(&L,&a);
if(operator_grade(formular[i])<operator_grade(a))
{
if(a!='(')Push(&S,a);
Push(&L,formular[i]);
}
else
{
Push(&L,a);
Push(&L,formular[i]);
}
}//if(formular[i])!=')')
else
{
for(Pop(&L,&a);(L.cout>0)&&(a!='(');Push(&S,a),Pop(&L,&a));
}
tag++;
}//if(is_operator(formular[i]))
else
{
Push(&S,formular[i]);
}
i++;
}
//在(后留在栈中的运算符放在
for(Pop(&L,&a);L.cout>0;Push(&S,a),Pop(&L,&a));
printf("/nThe postfix fomular is:/n");
for(i=0;S.cout>0;Pop(&S,&a),formular[i]=a,i++);
formular[i]='/0';
b=strlen(formular); //存后缀式的长度
for(i=b-1;i>=0;printf("%c",formular[i]),i--);
//算出表达式的值
i=b-1;
while(i>=0)
{
while(!is_operator(formular[i]))
{
Push(&S,formular[i]);
Push(&S,'!');
i--;
}
Pop(&S,&a);//删除!符号
if(a!='!')Push(&S,a);
k1=winnumber(&S,&a,number1);
Pop(&S,&a);//删除!符号
if(d)
{
h=operad(k1,d,formular[i]);
d=h;
if(i==0)printf("/nThe result is:%.3f/n",d);
}
else
{
k2=winnumber(&S,&a,number1);
if(is_special_code(formular[i])&&(k2<k1))
{
// printf("/n调用判断是否是/或者-");
d=operad(k2,k1,formular[i]);
if(i==0)printf("/nThe result is:%.3f/n",d);
}
else
{
k=opera(k2,k1,formular[i]);
if(i==0)printf("/nThe result is:%d/n",k);
innumber(&S,k);
Push(&S,'!'); //各个数据隔开标志
}
}
i--;
}
}
//zhan1.h
#define MAX 100
typedef struct stack{
int cout;
char data[MAX];
}stack;
//初始化栈
int Init(stack *L)
{
*L->data=(char)malloc(sizeof(stack));
if(!L->data){printf("内存分配出错!!");exit(0);}
L->cout=0;
L->data[L->cout]='#';
return 0;
}
//初始元素e入栈
int Push(stack *L,char e)
{
L->data[L->cout++]=e;
return 0;
}
//初始元素c出栈
int Pop(stack *L,char *c)
{
*c=L->data[--L->cout];
// printf("%c",c);
return 0;
}
//返回栈的长度
int stacklength(stack *L)
{
char c;
int i=0;
while(L->cout>0)
{
++i;
Pop(L,&c);
printf(" %c ",c);
}
return i;
}
//判断是否是空栈
int StackEmpty(stack *L)
{
if(L->cout>=0)return 1;
else return 0;
}
//清栈
int ClearStack(stack *L)
{
if(L->cout>=0)
{
L->cout=0;
L->data[L->cout]='#';
printf("/n清栈成功!!!/n");
return 0;
}
else
{
printf("/n此栈不存在!!/n");
return 1;
}
}
//摧毁栈
int Destory(stack *L)
{
if(L->cout>=0)
{
L->cout=0;
L->data[L->cout]=NULL;
return 0;
}
else
{
printf("/n此栈不存在!!/n");
return 1;
}
}
//判断是否是运算符
int is_operator(char op)
{
switch(op)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':return 1;
default:return 0;
}
}
//判断是否是/或者-
int is_special_code(char str)
{
if(str=='/'||str=='-')return 1;
else return 0;
}
//判断运算符的优先级
int operator_grade(char op)
{
switch(op)
{
case'+': case'-':return 1;
case'*': case'/':return 2;
case'(': case')':return 3;
default:return 0;
}
}
//将b与c进行str3运算
int opera(int b,int c,char str3)
{
int n;
if(str3=='+')n=b+c;
if(str3=='-')n=b-c;
if(str3=='*')n=b*c;
if(str3=='/')n=b/c;
return n;
}
//将a与b进行str3运算(小数和负数类)
double operad(double a,double b,char str3)
{
double n;
if(str3=='+')n=a+b;
if(str3=='-')n=a-b;
if(str3=='*')n=a*b;
if(str3=='/')n=a/b;
return n;
}
int numberchar(char number[5])
{
char number1[5];
for(int i=0,j=strlen(number)-1;j>=0;number1[i++]=number[j--]);
number1[i]='/0';
return atoi(number1);
}
//取出连续的数字字符转换成正序数字
int winnumber(stack *L,char *c,char number1[5])
{
int i;
Pop(L,c);
for(i=0;*c>='0'&&*c<='9';number1[i++]=*c,Pop(L,c));
number1[i]='/0';
Push(L,*c); //将最后出栈不是数字的字符重新推入栈中
// puts(number1);
// printf("%d",numberchar(number1));
return numberchar(number1);
}
//将数字转换一个个字符存入栈中
int innumber(stack *L,int k)
{
int i;
char a;
for(i=10;(k/i)>=10;i*=10);
for(;i>=10;a=k/i+48,Push(L,a),k%=i,i/=10);
a=k+48;
Push(L,a);
return 0;
}
//如果是*或者/的话就把它拿出来
char getachar(stack *L,char *c)
{
Pop(L,c);
if(*c=='*'||*c=='/'){return *c;}
else{Push(L,*c);return 0;}
}