计算表达式:6 5 2 3 + 8 * + 3 + *
算法思路:
使用栈,当见到一个数时就把它推入栈中;在遇到一个运算符时该运算符就作用于从该栈弹出的两个数上,将所得结果推入栈中。
stack.h
#ifndef STACK_H_
#define STACK_H_
struct StackRecord;
typedef struct StackRecord * STACK;
typedef int ElementType;
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType * array;
};
int IsEmpty(STACK S);
int IsFull(STACK S);
STACK CreateStack(int MaxElements);
void DisposeStack(STACK S);
void MakeEmpty(STACK S);
void Push(ElementType X,STACK S);
ElementType Top(STACK S);
void Pop(STACK S);
ElementType TopAndPop(STACK S);
#endif
#define EmptyTOS (-1)
#define MinStackSize (5)
stack.c
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
STACK CreateStack(int MaxElements)
{
STACK S;
if(MaxElements<MinStackSize)
{
puts("栈的大小太小");
exit(1);
}
S=(STACK)malloc(sizeof(struct StackRecord));
if(S==NULL)
{
puts("内存不足");
exit(1);
}
S->array=(ElementType *)malloc(sizeof(ElementType)*MaxElements);
if(S->array==NULL)
{
puts("内存不足");
exit(1);
}
S->Capacity=MaxElements;
MakeEmpty(S);
return S;
}
void DisposeStack(STACK S)
{
if(S!=NULL)
{
free(S->array);
free(S);
}
}
int IsEmpty(STACK S)
{
return S->TopOfStack==EmptyTOS;
}
int IsFull(STACK S)
{
return S->TopOfStack==S->Capacity;
}
void MakeEmpty(STACK S)
{
S->TopOfStack=EmptyTOS;
}
void Push(ElementType X,STACK S)
{
if(IsFull(S))
{
puts("栈满了");
exit(1);
}
else
S->array[++S->TopOfStack]=X;
}
ElementType Top(STACK S)
{
if(!IsEmpty(S))
return S->array[S->TopOfStack];
puts("空栈");
return 0;
}
void Pop(STACK S)
{
if(IsEmpty(S))
{
puts("空栈");
exit(1);
}
else
S->TopOfStack--;
}
ElementType TopAndPop(STACK S)
{
if(!IsEmpty(S))
return S->array[S->TopOfStack--];
puts("空栈");
return 0;
}
suffix.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stack.h"
#define LEN 10
#define MAXSTACK 100
int main(void)
{
STACK stack;
char str[LEN];
char symbol;
int element1,element2,element3;
const char STRING[]="+-*/";
int x;
//创建栈
stack=CreateStack(MAXSTACK);
//判断空栈
if(IsEmpty(stack))
printf("空栈\n");
printf("输入表达式 ( q 字符 退出): \n");
while(scanf("%s",str)==1 && str[0]!='q')
{
if(strstr(STRING,str))
{
symbol=str[0];
switch(symbol)
{
case '+' :
if(IsEmpty(stack))
{
printf("先输入数字\n");
exit(1);
}
else
{
element1=TopAndPop(stack);
element2=TopAndPop(stack);
element3=element1+element2;
Push(element3,stack);
break;
}
case '-' :
if(IsEmpty(stack))
{
printf("先输入数字\n");
exit(1);
}
else
{
element1=TopAndPop(stack);
element2=TopAndPop(stack);
element3=element1-element2;
Push(element3,stack);
break;
}
case '*' :
if(IsEmpty(stack))
{
printf("先输入数字\n");
exit(1);
}
else
{
element1=TopAndPop(stack);
element2=TopAndPop(stack);
element3=element1*element2;
printf("element3 %d\n",element3);
Push(element3,stack);
break;
}
case '/' :
if(IsEmpty(stack))
{
printf("先输入数字\n");
exit(1);
}
else
{
element1=TopAndPop(stack);
element2=TopAndPop(stack);
element3=element1/element2;
Push(element3,stack);
break;
}
}
}
else
{ x=atoi(str);
Push(x,stack);
}
}
//显示栈
printf("表达式的结果为:");
for(int i=0;i<=stack->TopOfStack;i++)
printf("%d",stack->array[i]);
putchar('\n');
return 0;
}
使用栈计算表达式6 5 2 3 + 8 * + 3 + *
本文介绍了如何利用栈来解析和计算数学表达式6 5 2 3 + 8 * + 3 + *。通过将数字压栈,遇到运算符时进行相应的操作,最终得出计算结果。

被折叠的 条评论
为什么被折叠?



