栈(一)利用栈计算表达式

整理了一下使用数据结构这本书上的内容

顺序栈类 sq_Stack.h

#pragma once
#include<iostream>
using namespace std;
template<class T>
class sq_Stack {
private:
	int mm;
	int top;
	T*s;
public:
	sq_Stack(int);//构造函数
	~sq_Stack();//析构函数
	void prt_sq_Stack();//顺序输出栈顶指针与栈中元素
	int flag_sq_Stack();//检测顺序栈状态
	void ins_sq_Stack(T);//入栈
	T del_sq_Stack();//退栈
	T read_sq_Stack();//读取栈顶元素
};
//建立容量为mm的空栈 
template<class T>
sq_Stack<T>::sq_Stack(int m)
{
	mm = m;
	s = new T[mm];
	top = 0;
	return;
}
//析构函数
template<class T >
sq_Stack<T>::~sq_Stack()
{
	delete[]s;
	top = 0;
	mm = 0;
	return;
}
//顺序输出栈顶指针与栈中元素
template<class T>
void sq_Stack<T>::prt_sq_Stack()
{
	cout << "top=" << top << endl;
	for (int i = top - 1; i >= 0; i--)
	{
		cout << s[i] << " ";
	}
	return;
}
//检测顺序栈状态
template<class T>
int sq_Stack<T>::flag_sq_Stack()
{
	if (top == mm)return -1;//满栈
	if (top == 0)return 0;//空栈
	return 1;
}
//入栈
template<class T>
void sq_Stack<T>::ins_sq_Stack(T data)
{
	if (top == mm)
	{
		cout << "overflow"; return;
	}
	s[top] = data;
	top++;
	return;
}
//退栈
template<class T>
T sq_Stack<T>::del_sq_Stack()
{
	if (top == 0)
	{
		cout << "underflow";
		return(0);
	}
	top--;
	return s[top];
}
//读取栈顶元素
template<class T>
T sq_Stack<T>::read_sq_Stack()
{
	if (top == 0)
	{
		cout << "empty";
		return(0);
	}
	return s[top - 1];
}
//int main()
//{
//	sq_Stack<int> s(10);
//	s.ins_sq_Stack(50); s.ins_sq_Stack(60); s.ins_sq_Stack(70); s.ins_sq_Stack(80); s.ins_sq_Stack(90); s.ins_sq_Stack(100);
//	s.prt_sq_Stack();
//	cout << endl;
//	cout << s.read_sq_Stack();
//	cout << endl;
//	cout << s.del_sq_Stack();
//	cout << s.del_sq_Stack();
//	cout << s.del_sq_Stack();
//	cout << endl;
//	s.prt_sq_Stack();
//}

利用栈来实现表达式

#include"sq_Stack.h"
double shishu(char*s, int *k)
{
	double  x = 0.0, y = 1.0;
	int flag = 1;
	char c;
	c = s[*k];
	while (c >= '0'&&c <= '9' || c == '.')
	{
		*k = *k + 1;
		if (c >= '0'&&c <= '9')
		{
			if (flag == 0)//处理小数点以后的数据
			{
				y *= 0.1; x += (c - '0')*y;
			}
			else//处理小数点之前的数据
			{
				x *= 10; x += c - '0';

			}
		}
		else
			flag = 0;
		c = s[*k];
	}
	return x;
}
//计算运算符的优先级
int pp(char c)
{
	int k;
	switch (c)
	{
	case'*':k = 2; break;
	case'/':k = 2; break;
	case'+':k = 1; break;
	case'-':k = 1; break;
	case'(':k = 0; break;
	case')':k = 0; break;
	case 0:k = -1; break;
	}
	return k;
}
int main()
{
	sq_Stack<double> sv(50);
	sq_Stack<char> sp(20);
	char s[60], c;
	int flag = 1, k;
	double x, y;
	sp.ins_sq_Stack(0);//表达式结束符进运算符栈
	cout << "input s:" << endl;
	cin >> s;
	k = 0;//扫描指针初始化
	c = s[k];
	while (flag)
	{
		if (c >= '0'&&c <= '9' || c == '.')//当前字符为数字字符或小数点
			sv.ins_sq_Stack(shishu(s, &k));
		else if (c == '(' || pp(c) > pp(sp.read_sq_Stack()))
		{
			sp.ins_sq_Stack(c);
			k++;
		}
		else if (c == 0&&sp.read_sq_Stack() == 0)
			flag = 0;
		else if (c == ')' && (sp.read_sq_Stack() == '('))
		{
			sp.del_sq_Stack();
			k++;
		}
		else if (pp(c) <=pp(sp.read_sq_Stack()))
		{
			y = sv.del_sq_Stack();
			x = sv.del_sq_Stack();
			c = sp.del_sq_Stack();
			switch (c)
			{
			case'*':x = x*y; break;
			case'/':x = x / y; break;
			case'+':x = x + y; break;
			case'-':x = x - y; break;
			}
			sv.ins_sq_Stack(x);
		}
		c = s[k];
	}
	cout << s << "=" << sv.read_sq_Stack() << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值