顺序栈

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

typedef struct {
	char *top;
	char *base;
	int stacksize;
}charstack;

typedef struct{
	int *top;
	int *base;
	int stacksize;
}intstack;

void initchar(charstack &s);
int pushchar(charstack &s,char e); 
int popchar(charstack &s,char &e);
int get_char(charstack s,char &e);
int empchar(charstack s);
void dischar(charstack s);
void initint(intstack &L);
int pushint(intstack &L,int e); 
int popint(intstack &L,int &e);
int get_int(intstack L,int &e);
int empint(intstack L);
int tran(char e);
void disint(intstack L);
int prior(char a); 
void trans(char exp[],char tran[]); 
int calcu(char exp[]);


void initchar(charstack &s)
{
	s.base=new char[100];
	if(s.base==NULL){//printf("空间分配失败!\n");
		exit(0);}
	s.stacksize=100;
	s.top=s.base;
}

int pushchar(charstack &s,char e)
{
	if(s.top-s.base>=s.stacksize)
	{//printf("字符栈满!按任意键继续!\n");
		getch();return 0;}
	*s.top++=e;
	return 1;
}

int popchar(charstack &s,char &e)
{
	if(s.base==s.top)
	{//printf("栈空!按任意键继续!\n");
		getch();return 0;}
	e=*--s.top;
	return 1;
}

int get_char(charstack s,char &e)
{
	if(s.base==s.top)
	{//printf("栈空!按任意键继续!\n");
		getch();return 0;}
	e=*(s.top-1);
	return 1;
}

int empchar(charstack s)
{
	if(s.base==s.top)
	{//printf("栈空!");
		return 1;}
	else return 0;
}

void dischar(charstack s)
{
	while(s.top!=s.base){
		printf("%c",*(s.top-1));s.top--;
	}printf("\n");
}

void initint(intstack &L)
{
	L.base=new int[100];
	if(L.base==NULL){//printf("空间分配失败!\n");
		exit(0);}
	L.stacksize=100;
	L.top=L.base;
}

int pushint(intstack &L,int e)
{	if(L.top-L.base>=L.stacksize)
	{//printf("栈满!按任意键继续!\n");
	getch();return 0;}
	*L.top++=e;
	return 1;
}

int popint(intstack &L,int &e)
{
	if(L.base==L.top)
	{//printf("栈空!按任意键继续!\n");
		getch();return 0;}
	e=*--L.top;
	return 1;
}

int get_int(intstack L,int &e)
{	if(L.base==L.top)
	{//printf("栈空!按任意键继续!\n");
	getch();return 0;}
	e=*(L.top-1);
	return 1;
}


int empint(intstack L)
{
	if(L.base==L.top)
	{//printf("栈空!");
		return 1;}
	else return 0;
}

int tran(char e)
{
	return e-'0';
}

void disint(intstack L)
{
	while(L.top!=L.base){
		printf("%d",*(L.top-1));L.top--;
	}printf("\n");
}

int prior(char a)
{
	if(a=='#') return 1;
	if(a=='(') return 2;
	if(a=='+'||a=='-') return 3;
	if(a=='*'||a=='/') return 4;
	else return 0;
}

void trans(char exp[],char tran[])
{
	int i=0,j=0,n=0;
	charstack s;
	char c;
	while(exp[n]!='\0')n++;
		exp[n]='#';
	exp[n+1]='\0';

	initchar(s);
	pushchar(s,'#');
	while(!empchar(s)){
		if(exp[i]<='9'&&exp[i]>='0')
			tran[j++]=exp[i];
		else{
			switch(exp[i]){
			case '(':pushchar(s,'(');break;

			case ')':popchar(s,c);
				while(c!='('){tran[j++]=c;popchar(s,c);}
				break;
			
			default:
				while(get_char(s,c)&&prior(c)>=prior(exp[i]))
					{if(c!='#') tran[j++]=c;popchar(s,c);}
				if(exp[i]!='#')pushchar(s,exp[i]);
			}
			printf("%c",tran[j]);
			}
		i++;
		}tran[j]='\0';
}

int calcu(char exp[])
{
	int t1,t2,t=0;
	intstack L;
	int i=0;
	initint(L);
	while(exp[i]!='\0')
	{
		if(exp[i]>='0'&&exp[i]<='9')
		{
			t=tran(exp[i]);
		pushint(L,t);
		}

		  if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/')
		{
			popint(L,t2);
			popint(L,t1);
			switch(exp[i]){
			case '+':t=t1+t2;pushint(L,t);break;
			case '-':t=t1-t2;pushint(L,t);break;
			case '*':t=t1*t2;pushint(L,t);break;
			case '/':t=t1/t2;pushint(L,t);break;
			}
		}
		i++;
	}
	popint(L,t);
	return t;
}


void main()
{
	char *a,*b;
	a=new char[100];
	b=new char[100];
	int result;
	printf("请输入你要输入的字符串:\n");
	scanf("%s",a);
	fflush(stdin);
	trans(a,b);

	printf("\n原表达式转化的后缀表达式为:%s",b);
            result=calcu(b);
            printf("\n\n计算结果:%d\n",result);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值