⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 栈的应用.cpp

📁 栈的应用
💻 CPP
字号:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#define maxsize 1000
#define DOUBLE_LEN 20
double stack[maxsize];
int top=-1;
void push(double value)  //进栈
{
	if(top>=maxsize)
	{
		cout<<"Stack Full"<<endl;
        exit(-1);
	}
	stack[++top]=value;
}

double pop()           //栈顶元素出栈
{
	if(top<0)
	{
		cout<<"Stack Empty"<<endl;
        return -1;          //如果栈是空的返回-1
	}
	return stack[top--];
}

int priority(int op)          //返回运算符op所对应的优先级数值
{
	switch(op)
	{
	case '*':
    case '/':
		return 3;
    case '+':
    case '-':
		return 2;
    case '(':
		return 1;
    default:
		return 0;
	}
}

int isdigit(int num)           //如果是数字
{
	if((num>=48)&&(num<=57))
		return 1;
	else if(num=='.')
		return 1;
	return 0;
}

int check(char *str)          //返回值,1是正确,0是错误
{
	int count=0;
    char c_temp=0;
    while((c_temp=*(str++))!=0)
	{
		if(c_temp=='(')
			count++;
		else if(c_temp==')')
			count--;
	}
	return (count==0?1:0);
}

int isoperator(int op)
{
	switch (op)
	{
	case '*':
    case '/':
    case '+':
    case '-':
		return 1;
    default:
        return 0;
	}
}

char *back_expression(char *mid_expression)//将中缀表达式转换为后缀表达式
{
	char c_temp=0;
    char *str_temp;
    int str_temp_pos=0;
    double stack_top_operator=0.0;/*operator on the top of stacl*/
    str_temp=(char*)malloc(maxsize);
    push((double)(';'));//把';'放入栈的底具有最底优先级
    while((c_temp=*(mid_expression++))!=0)//读如中缀表达式直到结束
	{
		if(c_temp=='(')//当运算符是'('时
			push((double)c_temp);
        else if(isdigit(c_temp))//如果读入的是数字或'.',把它写入 str_temp
		{
			str_temp[str_temp_pos++]=c_temp;
            while(((c_temp=*(mid_expression++))!=0)&&(isdigit(c_temp)))
			{
				str_temp[str_temp_pos++]=c_temp;
			}
			mid_expression--;
            str_temp[str_temp_pos++]=' ';
		}
		else if(c_temp==')')//如果读入的是')',运算应该出栈直到'('
		{
			while((c_temp=(int)pop())!='(')//弹出栈中所有元素直到'('
				str_temp[str_temp_pos++]=c_temp;
		}
		else if(isoperator(c_temp))//如果字符是运算符,比较优先级并决定入栈还是出栈
		{
			stack_top_operator=pop();
            while(priority((int)stack_top_operator)>=priority(c_temp))//'*','/'的优先级数是3,'+','-'的优先级数是2,否则是0
			{	str_temp[str_temp_pos++]=(int)stack_top_operator; 
                stack_top_operator=pop();
			}
			push(stack_top_operator);
            push((double)(c_temp));
		}
	}
	while((int)(stack_top_operator=pop())!=';')//弹出所有运算字符直到';'
    str_temp[str_temp_pos++]=stack_top_operator;
    str_temp[str_temp_pos]=0;
     return str_temp;
}

double cacl(char *back_expression)//将转换得到的后缀表达式求值
{
	char c_temp=0;
    double temp1=0,temp2=0;
    char str_temp[DOUBLE_LEN]={0};
    int str_temp_pos=0;
    while((c_temp=*(back_expression++))!=0)
	{
		if((isdigit(c_temp))||(c_temp=='.'))
        str_temp[str_temp_pos++]=c_temp;
        else if(c_temp==' ')
		{
			str_temp[str_temp_pos]=0;
            push(atof(str_temp));
            str_temp_pos=0;
		}
		else if(c_temp=='+')
		{
			temp2=pop();
            temp1=pop();
            push(temp1+temp2);
		}
		else if(c_temp=='-')
		{
			temp2=pop();
            temp1=pop();
            push(temp1-temp2);
		}
		else if(c_temp=='*')
		{
			temp2=pop();
            temp1=pop();
            push(temp1*temp2);
		}
		else if(c_temp=='/')
		{ 
			temp2=pop();
            temp1=pop();
            push(temp1/temp2);
		}
	}
	return pop();
}

void main()
{
	char str[20];
	cout<<"请输入中缀表达式:"<<endl;
	cin>>str;
    if(check(str))
	{
		cout<<"转换成的后缀表达式为:"<<endl;
		cout<<back_expression(str)<<endl;
		cout<<"计算结果为:"<<endl;
		cout<<cacl(back_expression(str))<<endl;
	}
	else
		cout<<"Wrong expression"<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -