一、栈
1、入栈出栈顺序:先进后出,后进先出
2、栈按分布不同分为
(1)顺序栈
(2)链式栈
二、队列
1、队列与栈的区别在于:栈是先进后出,后进先出。而队列是先进先出,后进后出。
将栈看作瓶子装水和倒水的话,可以将队列看作水龙头,先进的先出。
2、队列按分布不同分为
(1)链式队列
三、多项式计算器
#include <stdio.h>
#include "stack.h"
#include <stdlib.h>
#include <string.h>
//判断字符返回FALSE后进行计算
void calc(Stack *s_ope,Stack *s_num)
{
int sum1 = GetTop(s_num); //取出第一个要计算的数
pop(s_num);
int sum2 = GetTop(s_num); //取出第二个要计算的数
pop(s_num);
int ope = GetTop(s_ope); //取出要运算的符号
pop(s_ope);
int res; //保存运算结果
switch(ope)
{
case '+':
res = sum1+sum2;
break;
case '-':
res = sum2-sum1;
break;
case '*':
res = sum1*sum2;
break;
case '/':
res = sum2/sum1;
break;
default:
break;
}
push(s_num,res); //将结果入栈
}
//判断是否要入栈TRUE为要入栈,FALSE为不入栈
BOOL jud(Stack *s_ope,int n)
{
if(Null(s_ope))
{
return TRUE;
}
int top = GetTop(s_ope);
switch(top)
{
case '+':
case '-':
if('*' == n || '/' == n || '(' == n)
return TRUE;
break;
case '*':
case '/':
if('(' == n)
return TRUE;
break;
case '(':
if(')' == n)
{
pop(s_ope);
}
return TRUE; //有点问题
break;
default:
break;
}
return FALSE;
}
//对字符进行操作
void deal_ope(Stack *s_ope,Stack *s_num,int n)
{
if(TRUE == jud(s_ope,n)) //返回为TRUE入栈
{
push(s_ope,n);
}
else //返回为FALSE,不入栈,并对数据进行处理
{
while(FALSE == jud(s_ope,n))
{
calc(s_ope,s_num);
}
if(')' != n)
{
push(s_ope,n);
}
}
}
int main()
{
char buf[100];
printf("请输入要计算的式子\n");
fgets(buf,100,stdin);
buf[strlen(buf)-1] = '\0';
char *p = buf; //用来遍历数组
Stack s_num; //创建栈存放数字
Stack s_ope; //创建栈存放符号
Init(&s_num); //初始化
Init(&s_ope);
while(*p)
{
if(*p >= '0' && *p <= '9') //数字入栈
{
int tmp = 0;
while(*p >= '0' && *p <= '9')
{
tmp = tmp*10+*p - '0';
p++;
}
push(&s_num,tmp);
continue;
}
deal_ope(&s_ope,&s_num,*p); //字符入栈
p++;
}
while (!Null(&s_ope)) //如果字符栈不为空,说明数据还没计算玩
calc(&s_ope,&s_num);
int sum = GetTop(&s_num); //得到并且打印最终结果
printf("%d\n",sum);
return 0;
}