数据结构--栈

顺序栈

 

.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值