尝试做以下习题:
//表达式
char a[] = "3+5*2-1+8/2"
5 * 2 == 10
3 + 10 == 13
13 - 1 == 12
8 / 2 = 4
12 + 4 = 16
上面的表达式可以用栈来实现
创建2个栈
1 操作数栈(3, 5, 2, 1, 8, 2)
2 运算符栈('+' '*' '-' '+' '*')
linkstack.c
#include <stdio.h>
#include <stdlib.h>
#include "linkstack.h"
//1.创建一个空的无头单向链表
void createStack(stack_t **ptop)
{
*ptop=NULL;
//将栈针赋地址为NULL
}
//2.入栈
int inStack(stack_t **ptop,datatype data)
{
//1.开辟一个新节点,保存入栈的数据
stack_t *pnew=(stack_t *)malloc(sizeof(stack_t));
if(pnew == NULL)
{
printf("malloc node err.\n");
return -1;
}
//2.初始化
pnew->data=data;
pnew->next=NULL;
//3.入栈
pnew->next=*ptop;
*ptop=pnew;
return 0;
}
//3.出栈
datatype outStack(stack_t **ptop)
{
stack_t *pdel=NULL;
datatype data;
//容错处理
if(isEmptyStack(*ptop))
{
printf("isEmptyStack err.\n");
return -1;
}
//定义一个指针保存出栈节点地址
pdel=*ptop;
(*ptop)=(*ptop)->next;
data=pdel->data;
//n释放出栈节点地址空间
free(pdel);
pdel=NULL;
return data;
}
//4.判断栈是否为空
int isEmptyStack(stack_t *top)
{
return top == NULL;//1:空 0:非空
}
//5.清空栈
void clearStack(stack_t **ptop)
{
while(!isEmptyStack(*ptop))
outStack(ptop);
}
//6.求栈的长度
int lengthStack(stack_t *top)
{
int len=0;
while(top != NULL)
{
len++;
top=top->next;
}
return len;
}
//7.获取栈顶的值
datatype topStack(stack_t *top)
{
return top->data;
}
linkstack.h
#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__
typedef int datatype;
typedef struct node_t
{
datatype data;
struct node_t *next;
}stack_t;
//1.创建一个空的无头单向链表
void createStack(stack_t **ptop);
//2.入栈
int inStack(stack_t **ptop,datatype data);
//3.出栈
datatype outStack(stack_t **ptop);
//4.判断栈是否为空
int isEmptyStack(stack_t *top);
//5.清空栈
void clearStack(stack_t **ptop);
//6.求栈的长度
int lengthStack(stack_t *top);
//7.获取栈顶的值
datatype topStack(stack_t *top);
#endif
main.c
#include <stdio.h>
#include "linkstack.h"
//判断优先级
int priHigh(char op)
{
if(op == '-' || op == '+')
return 1;
if(op == '*' || op== '/')
return 2;
return 0;//判断错误
}
//运算函数
int yunsuan(int data1,char op,int data2)
{
switch(op)
{
case '+':
return data1+data2;
break;
case '-':
return data1-data2;
case '*':
return data1*data2;
case '/':
return data1/data2;
}
return -1;
}
int main(int argc, const char *argv[])
{
char a[] = "3+5*2-1+8/2";
char op;
int data1,data2;
char *p=a;
//1.创建两个栈,运算符栈。数据栈
stack_t *char_p;
stack_t *data_p;
createStack(&char_p);
createStack(&data_p);
while(*p)
{
if(*p >= '0' && *p<= '9' )
inStack(&data_p,*p-'0');
else
{
if(isEmptyStack(char_p))
{
inStack(&char_p,*p);
}else
{//栈顶数据优先级大于 *p 运算符优先级
//栈顶运算符出栈运算
if(priHigh(topStack(char_p)) >= priHigh(*p) )
{
op=outStack(&char_p);
data1=outStack(&data_p);
data2=outStack(&data_p);
inStack(&data_p,yunsuan(data2,op,data1));
continue;
}else
{
inStack(&char_p,*p);
}
}
}
p++;
}
while(!isEmptyStack(char_p))
{
op=outStack(&char_p);
data1=outStack(&data_p);
data2=outStack(&data_p);
inStack(&data_p,yunsuan(data2,op,data1));
}
printf("%d\n",outStack(&data_p));
return 0;
}