数据结构之栈的应用
- 先实现求值这一步吧,已知后缀表达式
- 转换这一环节待更新…
上代码:
/* 中缀表达式转后缀表达式(seqstack)以及求值
* version: 1.0(求值,需要自己输入后缀表达式)
* 2.0(加上转化功能)
* 算法: 创建一个操作数栈,自左向右遍历后缀表达式,遇到一个操作数就入栈,
* 遇到一个操作符就从栈中取出两个操作数进行当前计算,载把结果入栈,
* 直到表达式末尾, 最后一个入栈的就是最终结果
*/
#include <stdio.h>
#include <stdlib.h>
#define maxsize 100
#define datatype int
typedef struct {
datatype data[maxsize];
int top; // top 指明当前栈顶元素的位置
} SeqStack, *PSeqStack;
// 初始化顺序栈
PSeqStack Init_SeqStack(){
PSeqStack S;
S = (PSeqStack) malloc(sizeof(SeqStack));
//printf("%p\n", S);
if (S)
S -> top = -1; // top 设为-1 (认为设定),表示空
return S; // 返回指向顺序栈的指针
}
// 判断栈空
int Empty_SeqStack(PSeqStack S){
// 没有元素,空栈
if (S -> top == -1)
return 1; // 1 表示为空
return 0;
}
// 入栈
void Push_SeqStack(PSeqStack S, datatype x){
if (S -> top == maxsize-1){
printf("栈满不能再入栈\n");
//return 0; // 返回 0 表示失败
}
else{
S -> top ++;
S -> data[S -> top] = x;
//return 1;
}
}
// 出栈,保存栈顶元素于*x中,并删除
void Pop_SeqStack(PSeqStack S, datatype *x){
if (Empty_SeqStack(S)){
printf("栈空不能出栈\n");
//return 0; // 0 表示出栈失败
}
else{
*x = S -> data[S -> top];
S -> top --;
//return 1;
}
}
// 取栈顶元素,只是获取他的值并存入*x,并没有取出来(删除),注意区别
int GetTop_SeqStack(PSeqStack S, datatype *x){
if (Empty_SeqStack(S)){
printf("栈空不能取top元素\n");
return 0;
}
else{
*x = S -> data[S -> top];
return 1;
}
}
// 销毁栈,参数为待销毁顺序栈的指针地址
void Destory_SeqStack(PSeqStack *S){
// *S 二级指针
if (*S)
free (*S);
*S = NULL;
return;
}
/* 判断是否是操作数 */
int IsNum(char c){
if (c >= '0' && c <= '9'){
return 1;
}
return 0;
}
char transfer(){
}
/* 核心函数 */
int calculate(char *A){
PSeqStack s = Init_SeqStack();
int result;
int a, b, c; // a,b 上一次,上上一次入栈的元素,C是临时变量
char ch;
ch = *A ++;
/* 我们人为设置,在字符数组末尾加一个'#', 作为结束符 */
while(ch != '#'){
if (IsNum(ch)){
Push_SeqStack(s, ch - '0');
}
else
{
/* 这里注意, 先进后出 */
Pop_SeqStack(s, &b);
Pop_SeqStack(s, &a);
switch (ch)
{
case '+':
c = a+b;
break;
case '-':
c = a-b;
break;
case '*':
c = a*b;
break;
case '/':
c = a/b;
break;
default:
break;
}
/* 临时结果入栈 */
Push_SeqStack(s, c);
}
ch = *A ++;
}
GetTop_SeqStack(s, &result);
Destory_SeqStack(&s);
return result;
}
int main(){
char num[12] = {'1','2','8','5','-','*','+','4','2','/','-', '#'};
printf("计算结果: %d\n",calculate(num));
return 0;
}
输入:
char num[12] = {'1','2','8','5','-','*','+','4','2','/','-', '#'};
运行结果:
qian@qian-ASUS:~/vs code/data_structure/.vscode/examples$ cd "/home/qian/vs code/data_structure/.vscode/examples/" && gcc -g mid_2_suffix.c -o mid_2_suffix && "/home/qian/vs code/data_structure/.vscode/examples/"mid_2_suffix
5