顺序栈
.h
.c
main.c
链栈(四则运算实现)
.h
#pragma once
#ifndef _LINKSTACK_H
#define _LINKSTACK_H
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct node
{
struct node*next;
int data;
}node;
typedef struct stack
{
node* Top;
int length;
}stack;
stack* LinkstackCreate();
//判断栈是否为空
int StackIsEmpty(stack* s);
//入栈
void Push(stack* s, int data);
//出栈
int pop(stack* s);
//取栈顶元素
int Top(stack* s);
//四则运算
void Calculator();
int Priority(char ch);
#endif // !_SEQSTACK_H
.c
#include"linkstack.h"
//创建空栈
stack* LinkstackCreate()
{
stack* s = (stack * )malloc(sizeof(stack));
if (s == NULL)
{
printf("malloc failure!\n");
return;
}
s->length = 0;
s->Top = NULL;
return s;
}
//判断栈是否为空
int StackIsEmpty(stack*s)
{
return (s->Top==NULL)? TRUE:FALSE;
}
//入栈
void Push(stack* s,int data)
{
if(s==NULL)
{
printf("栈初始化失败!\n");
return;
}
node*temp= (node*)malloc(sizeof(node));
if (temp == NULL)
{
printf("malloc failure!\n");
return 0;
}
//赋初值
temp->next = NULL;
temp->data = data;
//将节点插入顶端
temp->next = s->Top;
s->Top = temp;
s->length++;
return ;
}
//出栈
int pop(stack* s)
{
if (s == NULL)
{
printf("栈初始化失败!\n");
return;
}
if (TRUE==StackIsEmpty(s))
{
printf("栈空无法弹出\n");
return -1;
}
node* p =s->Top;//申请指针q保存被删除节点地址
s->Top = p->next;
int value = p->data;
free(p);
s->length--;
return value;
}
//取栈顶元素
int Top(stack* s)
{
if (s== 0)
{
printf("栈初始化失败\n");
return -1;
}
if (TRUE == StackIsEmpty(s))
{
printf("栈空无法弹出\n");
return -1;
}
return s->Top->data;
}
//四则运算
void Calculator()
{
//创建两个栈
stack* s_opt = LinkstackCreate();//存放运算符
stack* s_num = LinkstackCreate();//存放操作数
printf("请输入一个表达式:\n");
char opt[128] = { 0 };
scanf_s("%s", opt, 128);
int i = 0;//控制字符数组opt的下标
int temp = 0;
int num1, num2;
while (opt[i] != '\0' || StackIsEmpty(s_opt) != TRUE)
{
if (opt[i] >= '0' && opt[i] <= '9')
{
temp = temp * 10 + opt[i] - '0';
i++;
if (opt[i] >= '0' && opt[i] <= '9')
{
continue;
}
else
{
Push(s_num, temp);
temp = 0;
}
}
else//运算符
{
if (StackIsEmpty(s_opt) == TRUE || Priority(opt[i]) > Priority(Top(s_opt)) || opt[i] == '(')
{
Push(s_opt, opt[i]);
i++;
continue;
}
if (Top(s_opt) == '(' && opt[i] == ')')
{
pop(s_opt);
i++;
continue;
}
if ((Priority(opt[i]) <= Priority(Top(s_opt))) || (opt[i] == ')' && Top(s_opt) != '(' || opt[i] == '\0' && StackIsEmpty(s_opt) != TRUE))
{
num1 = pop(s_num);
num2 = pop(s_num);
switch (pop(s_opt))
{
case'+':
Push(s_num, num1 + num2);
break;
case'-':
Push(s_num, num1 - num2);
break;
case'*':
Push(s_num, num1 * num2);
break;
case'/':
Push(s_num, num1 / num2);
break;
default:
break;
}
}
}
}
printf("计算结过:%d\n", Top(s_num));
}
int Priority(char ch)
{
switch (ch)
{
case'+':
case'-':
return 1;
case'*':
case'/':
return 2;
default:
return 0;
}
}
main.c
#include"linkstack.h"
int main(void)
{
Calculator();
return 0;
}