栈的应用举例-进行算术运算

这个例子是来自于严蔚敏的《数据结构》的栈那一节。 但是我进行了一些简单的修改,确保编译通过。

目的:利用栈 计算 “3*(7-2)”这样的字符串的算术运算的结果。 共有3个代码文件,如下:

1、mystack.h

#pragma once

#define maxsize 30
typedef struct
{
	char data[maxsize+1];
    int top;
}Stack;

int Push(Stack& S,char x);
int Pop(Stack& S,char& x);
char readtop(Stack S);

2、mystack.cpp

#include "mystack.h"
#include "stdio.h"

int Push(Stack& S,char x)
{
	if (S.top==maxsize)
	{
		printf("overflow\n");
		return(0);
	}
	S.data[++S.top]=x;
	return(1);
}

int Pop(Stack& S,char& x)
{
	if(S.top==0)
	{
		printf("undertflow\n");
		return(0);
	}
	x=S.data[S.top];
	S.top--;
	return(1);
}

char readtop(Stack S)
{
	char a;
          a=S.data[S.top];
	return(a);
}

3、 caclstack.cpp

#include <iostream>
#include <string>
#include "mystack.h"
using namespace std;

double operate(char ch, double x,double y);

int precede(char p1,char p2);

double calcul(char a[]);
 
//这是进行测试的main 函数
int main()
{
	char tmp[]="3*(7-2)#";  // 输入的字符串一定要以# 结尾。
        // char tmp[]="3*(7-2)+5*2#";
	double rst = calcul(tmp);
	cout<<rst<<endl;
	getchar();

	return 0;
}

double operate(char ch, double x,double y)
{
	double z;
	switch (ch)
	{
	case '+' : z=x+y; break;
	case '-' : z=x-y; break;
	case '*' : z=x*y; break;
	case '/' : z=x/y; break;
	}
	return((char)z);
}

//这个函数最关键
int precede(char p1,char p2)
{
	int flag = -2;
	switch (p1)
	{
	case '+' :
		if(p2=='*' || p2=='/' || p2== '(' ) flag=-1;
		else flag=1;
		break;
	case '-' :
		if(p2=='*' || p2=='/' || p2== '(' ) flag=-1;
		else flag=1;
		break;
	case '*' :
		if(p2=='(' ) flag=-1;
		else flag=1;
		break;
	case '/' :
		if(p2=='(' ) flag=-1;
		else flag=1;
		break;
	case '(' : if(p2==')') flag=0;
			   else if(p2=='#')printf("error 1 operator!\n");
			   else flag=-1;
			   break;
	case ')' : if(p2=='(' )printf("error 2 operator!\n");
			   else flag=1;
			   break;
	case '#' : if(p2==')' )printf("error 3 operator!\n");
				else if(p2=='#' )
					flag=0;
				else
					flag=-1;
				break;
	}
	return(flag);
}

double calcul(char a[])
{
	Stack S1, S2;
	S1.top = 0;
	S2.top = 0;
	double x, y, z;
	char x1,x2;
	char r, ch;
	int I=0;
	Push(S1,'#');
	r=a[I];
	//while(r<>'#' || readtop(S1)<>'#')
	while(r != '#' || readtop(S1) != '#')
	{
		if(r<='9' && r>='0')
		{
			x=0;
			while(r<='9' && r>='0')
			{
				x=x*10+r-'0';
				r=a[++I];
			}
			Push(S2,x);
		}
		else
			switch(precede(readtop(S1),r))
		{
			case -1:
				Push(S1,r); r=a[++I]; break; //把运算符放进栈1
			case 0:
				Pop(S1,ch);
				r=a[++I];
				//r=a[I];
				break; //弹出一个运算符
			case 1:
				Pop(S1, ch); Pop(S2, x1); Pop(S2, x2);
				Push(S2,operate(ch, x2,x1));
				//r=a[++I];
                 r=a[I];
				break;
		}
	}
	return(readtop(S2));
}

以上代码在VS 下编译通过,并且执行结果正确。

注意:本文的栈 是用的自定义 的mystack。

另外更多原理 请参考 严蔚敏的数据结构相关章节。

栈的应用举例-进行算术运算,布布扣,bubuko.com

时间: 2025-01-12 08:56:20

栈的应用举例-进行算术运算的相关文章

栈的java实现和栈的应用举例

转自:http://coolxing.iteye.com/blog/1468674 —————————————————————————————————————————————————————————— [例子和习题出自数据结构(严蔚敏版), 本人使用java进行实现.  转载请注明作者和出处,  如有谬误, 欢迎在评论中指正. ] 栈的实现 栈是一种先进后出的数据结构, 首先定义了栈需要实现的接口: Java代码   public interface MyStack<T> { /** * 判断

第三章:2.栈和队列 -- 栈的应用举例

前言: 本节为栈的应用举例,只包括代码实现部分 目录: 2.栈的应用举例 进制转换: 括号匹配: 正文: 进制转换实现代码: 注意:此函数要和上一节,栈的实现代码放在一起 //进制转换 void conversion(){ SqStack S; InitStack(S); int num; printf("%s","请输入一个十进制数:"); scanf("%d",&num); while(num){ Push(S,num%8); num

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

第三章:1.栈和队列 -- 栈的表示及实现

前言: 栈和队列 是两种重要的线性结构.从数据结构角度来看,栈和队列也是线性表,它的特殊性在于其操作是线性表的子集,是操作受限的线性表,因此可以称作限定性的数据结构. (限定性:如.人为的规定线性表只能从表尾插入和删除结点数据元素,那么这样的线性表就是栈) 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离散事件模型 正文: 栈的定义 栈(stack) 如上所说,就是限定只能在表尾进行插入和删除的线性表.表尾 称为 栈顶(top), 表头 称为 栈底 (bottom),没有数

全是套路——出栈顺序

实习终于结束了,好久没有总结编程问题了,因为最近真是没怎么写程序. 今天做华为的火车进站问题,这是一道看似像全排列,其实是栈的问题. 看了一些网上的写法,掌握了一种思路,也是种投机取巧的方法: 先产生序列的全排列,然后再全排列里面去除不可能的出栈顺序. 1.全排列很好产生,用stl里面的next_permutation(begin,end) 2.判断这个排列是不是正确的出栈顺序. 就第2点: 1.给一种进栈顺序加上序号,比如4,2,8这么进栈,则4为0,2为1,8为2,以此类推.只是想表明一个顺

数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例

一.简述 栈,LIFO.是操作受限的线性表,和线性表一样有两种存储表示方法.下面以顺序存储为例,实现. 二.ADT 暂无. 三.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 46 9 10 #ifndef _3_1_H_ 11 #define _3_1_H_ 12

c#栈的实现

今天学习c#当中实现栈,学过C#的都知道,c#本身已经写好 了栈和队列,我们可以直接用,这里自己实现以下,就是为了更深刻的理解. 首先说明线性表,栈.队列他们的数据元素以及数据元素之间的逻辑关系实际上都是相同的,不同的是线性表的操作不受限制,而栈和队列则受限制,栈的操作只能在一端进行,队列的扎入在一端进行,别的操作在另一端进行. 我们通常把表尾看做是栈顶,另一端是固定的叫栈底,栈中没有数据时我们称为空栈. 实现栈的代码 public class SeqStack<T> { private in