//后缀法
#include <stdio.h>
#include <stdlib.h>
#define _LINKSTACK_H
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
typedef int Elemtype;
typedef int Elemtype;
typedef struct node //包含数据元素和next指针
{
Elemtype data;
struct node *next;
}Node;
typedef struct stack //包含栈顶元素和栈的规模
{
struct node *top;
int count;
}Stack;
int StackInit(Stack **stack) //初始化
{
if(NULL==stack)
{
return 0; //初始化失败
}
*stack=(Stack *)malloc(sizeof(Stack)*1);
if(NULL==*stack)
{
return 0;
}
(*stack )->top=NULL; //栈的栈顶元素初始化为空
(*stack)->count=0; //栈的规模初始化为0
return 1; //初始化成功
}
int StackEmpty(Stack *stack)
{
if(NULL == stack)
{
return FAILURE; //栈为空或栈顶元素不为空为0
}
//栈顶元素为空为1
return (stack->top == NULL) ? TRUE : FALSE;
}
int Push(Stack **stack, Elemtype e)
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p;
p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
return FAILURE;
} //将元素e放入到栈stack中
p->data = e;
p->next = (*stack)->top;
(*stack)->top = p;
(*stack)->count++;
return SUCCESS;
}
int GetTop(Stack *stack) //找栈顶元素
{
if(NULL == stack)
{
return FAILURE;
}
return stack->top->data;
}
int Pop(Stack **stack) //删除栈顶元素(每运算一次就要把栈顶元素删除)
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p = (*stack)->top;
Elemtype e = (*stack)->top->data;
(*stack)->top = (*stack)->top->next; //新的栈顶元素指向原来栈顶元素的下一个元素
(*stack)->count--; //栈的规模-1
free(p);
p = NULL;
return e;
}
int StackClear(Stack **stack) //把栈清空
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p;
while((*stack)->top != NULL)
//清空方法:一直删除栈顶元素,然后将新的栈顶元素指向原来栈顶元素的下一个元素
//然后接着删除栈顶元素
{
p = (*stack)->top;
(*stack)->top = (*stack)->top->next;
(*stack)->count--;
free(p);
}
return SUCCESS;
}
int StackDestory(Stack **stack) //销毁栈,在清空的基础上,将栈指向空
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p;
while((*stack)->top != NULL)
{
p = (*stack)->top;
(*stack)->top = (*stack)->top->next;
(*stack)->count--;
free(p);
}
free(*stack);
*stack = NULL;
return SUCCESS;
}
int priority(char ch) //各种运算
{
switch(ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default :
return 0;
}
}
int main()
{
char opt[1024]={0};
int num1=0,num2=0,i=0,tmp=0;
Stack *s_num=NULL,*s_opt=NULL; //数字,符号
if(StackInit(&s_num)==0||StackInit(&s_opt)==0)
{
printf("初始化失败!"); //先查看是否初始化成功
return 0;
}
printf("请输入一个表达式(以#结尾):\n");
scanf("%s",opt);
//i从0开始遍历
while(opt[i] != '\0' || StackEmpty(s_opt) != TRUE) //结束条件
//等于回车或栈顶元素为空(所有数字已经运算完毕)时结束运算
{
if(opt[i] >= '0' && opt[i] <= '9')
{
tmp = tmp*10 + opt[i]-'0';
i++;
if(opt[i] < '0' || opt[i] > '9') //数字之外(遇到符号了)
{
Push(&s_num, tmp); //将数字tmp放入数字栈中
tmp = 0;
}
}
else
{
if(opt[i] == ')' && GetTop(s_opt) == '(') //判断符号(出现一对括号)
{
Pop(&s_opt); //删除栈顶符号
i++;
continue;
}
if(StackEmpty(s_opt) == TRUE ||
(GetTop(s_opt) == '(' && opt[i] != ')') ||
(priority(opt[i]) > priority(GetTop(s_opt))) )
{
Push(&s_opt, opt[i]); //将符号放入符号栈中
i++;
continue;
}
if((opt[i] == '\0' && StackEmpty(s_opt) != TRUE)||
(opt[i] == ')' && GetTop(s_opt) != '(') ||
( priority(opt[i]) <= priority( GetTop(s_opt) ) ) )
{
switch(Pop(&s_opt)) //各种运算
{
case '+':
num1 = Pop(&s_num);
num2 = Pop(&s_num);
Push(&s_num, num1+num2);
break;
case '-':
num1 = Pop(&s_num);
num2 = Pop(&s_num);
Push(&s_num, num2-num1);
break;
case '*':
num1 = Pop(&s_num);
num2 = Pop(&s_num);
Push(&s_num, num1*num2);
break;
case '/':
num1 = Pop(&s_num);
num2 = Pop(&s_num);
Push(&s_num, num2/num1);
break;
}
}
}
}
printf("%d\n", GetTop(s_num));
return 0;
}
栈与队列的应用(数据结构实验二)
于 2022-04-29 16:22:29 首次发布