栈的应用(实现运算)

尝试做以下习题:
//表达式
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;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现四则运算应用可以使用后缀表达式来计算。步骤如下: 1. 将中缀表达式转换为后缀表达式,例如将 "3 + 4 * 2 / (1 - 5) ^ 2" 转换为 "3 4 2 * 1 5 - 2 ^ / +" 2. 创建一个来存储数字和运算符。 3. 从左到右扫描后缀表达式的每个元素,如果是数字则入,如果是运算符则取出顶的两个数字进行运算并将结果入。 4. 扫描完后缀表达式后,顶即为最终结果。 以下是一个简单的 Python 实现: ```python class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() def top(self): if not self.is_empty(): return self.items[-1] def calculate_postfix(expression): stack = Stack() for token in expression: if token.isdigit(): stack.push(int(token)) else: operand2 = stack.pop() operand1 = stack.pop() if token == '+': result = operand1 + operand2 elif token == '-': result = operand1 - operand2 elif token == '*': result = operand1 * operand2 elif token == '/': result = operand1 / operand2 elif token == '^': result = operand1 ** operand2 stack.push(result) return stack.pop() def infix_to_postfix(expression): precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} stack = Stack() postfix = [] for token in expression: if token.isdigit(): postfix.append(token) elif token == '(': stack.push(token) elif token == ')': while not stack.is_empty() and stack.top() != '(': postfix.append(stack.pop()) stack.pop() else: while not stack.is_empty() and stack.top() != '(' and precedence[stack.top()] >= precedence[token]: postfix.append(stack.pop()) stack.push(token) while not stack.is_empty(): postfix.append(stack.pop()) return postfix expression = "3 + 4 * 2 / (1 - 5) ^ 2" postfix = infix_to_postfix(expression.split()) result = calculate_postfix(postfix) print(result) # 输出 -3.5 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值