使用栈实现整型表达式的计算
来源:互联网 发布:破解版小说软件 编辑:程序博客网 时间:2024/05/21 06:36
(C语言算法)顺序栈实现整型算术表达式的求值
#include <stdio.h>
#include <stack>
#include <iostream>
using namespace std;
stack<int> num;
stack<char> operate;
int opp(int x1, int x2, char c)
{
switch(c)
{case '+':
return x1 + x2;
case '-':
return x1 - x2;
case '*':
return x1 * x2;
case '/':
return x1 / x2;
}
}
int calculate(char *s)
{
char *p = s;
while(*p)
{
if(*p>='0' && *p<='9')
num.push(*p++ - '0');
else if(*p == ')')
{
int x1 = num.top();
num.pop();
int x2 = num.top();
num.pop();
char op = operate.top();
operate.pop();
operate.pop();
x1 = opp(x2, x1, op);
num.push(x1);
p++;
}
else if(*p == '*' || *p == '/')
{
char c = *p++;
int x2 = *p++ - '0';
// p++;
int x1 = num.top();
num.pop();
x1 = opp(x1, x2, c);
num.push(x1);
}
else if(*p == '+' || *p == '-' || *p == '(')
{
operate.push(*p++);
}
}
while(!operate.empty())
{
char c = operate.top();
operate.pop();
int x1 = num.top();
num.pop();
int x2 = num.top();
num.pop();
x1 = opp(x1, x2, c);
num.push(x1);
}
int x = num.top();
num.pop();
return x;
}
int main()
{
/*cout << sizeof(short) << sizeof(int) << endl;
int x = opp(4, 2, '-');
cout << x << endl;*/
int x = calculate("4*5+6/3");
cout << x << endl;
return 0;
}
/* 下面是别人的,看着好啰嗦啊~~~~~~
此程序的功能是求出用户输入的整形表达式的值20-10-07 17:43*/
/*输入的表达式请用#结尾,比如:2+3+5,应输入:2+3+5#。*/
#include <stdio.h>
#define MAXSIZE 16
typedef struct{
int data[MAXSIZE];
int top;
int base;
}seqstack; /* 顺序栈的定义*/
/*以下为函数声明*/
void InitStack(seqstack *);
int Empty(seqstack *);
void Push(seqstack *, int );
int Pop(seqstack *);
int GetTop(seqstack *);
int Operate(int ,char ,int );
char Proceed(char ,char );
int In(char );
int EvalExpres(void);
/* 定义两个栈分别存放运算符和操作数*/
seqstack StackR,StackD;
/*主函数*/
int main()
{
int v;
char ch;
while(1)
{
printf("\t@@@@@@@@本程序的功能为:用顺序栈实现整型算术表达式的求值@@@@@@@@\n");
printf("\t@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-20-10-07 17:47-@@@@@@\n");
v = EvalExpres();
printf("The result is:%d",v);
/*以下为程序控制*/
printf("\nInput 'q' to quit and ENTER run again:");
do{
scanf("%c",&ch);
if(ch == 'q' || ch == 'Q')
exit(0);
}while(ch!='\n');
system("cls");
}
return 0;
}
void InitStack(seqstack *s)
{ s->top = 0;
s->base = 0;
} /* 初始化栈*/
int Empty(seqstack *s)
{ if(s->top == s->base)
return 1;
else
return 0;
} /* 判断栈是否为空*/
void Push(seqstack *s, int x)
{
if(s->top == MAXSIZE)
{ printf("OVER FLOW!\n");
exit(0);
}
else
{ s->data[s->top] = x;
s->top++;
}
} /* 进栈 */
int Pop(seqstack *s)
{ int e;
if(Empty(s))
{ printf("Under flow!\n");
return 0;
} /* 下溢*/
else
{ s->top--;
e = s->data[s->top];
return e;
}
} /* 出栈*/
int GetTop(seqstack *s) /*取栈顶元素*/
{
if(Empty(s))
{ printf("Under flow!\n");
return 0;
}
else
return s->data[s->top-1];
}
int EvalExpres(void) /* 表达式求解函数*/
{
int a,b,i=0,s=0;
char c[80],r;
InitStack(&StackR);
Push(&StackR,'#');
InitStack(&StackD);
printf(" 请输入表达式并以‘#’结束:");
gets(c);
while(c[i]!='#' || GetTop(&StackR)!='#')
{
if(!In(c[i])) /* 判断读入的字符不是运算符 是则进栈*/
{ if(c[i] >= '0' && c[i] <= '9')
{
s += c[i]-'0';
while(!In(c[++i])) /*此处实现的功能为当输入的数字为多位数时*/
{ s*=10;
s += c[i]-'0';
}
Push(&StackD,s+'0');
s = 0;
}
else
{
printf("你输入的表达式有误!\n");
return 0;
}
}
else
switch(Proceed(GetTop(&StackR),c[i])) /* 此函数用来比较读取的运算符和栈顶运算符的优先级*/
{
case '<': /* 栈顶的元素优先级高*/
Push(&StackR,c[i]);
i++;
break;
case '=': /* 遇到匹配的小括号时则去掉他*/
Pop(&StackR);
i++;
break;
case '>': /* 栈顶的优先级低则出栈并将结果写入栈内*/
r = Pop(&StackR);
a = Pop(&StackD)-'0';
b = Pop(&StackD)-'0';
Push(&StackD,Operate(a,r,b)) ;
break;
}
}
return (GetTop(&StackD)-'0'); /* 返回运算结果*/
}
int In(char c) /*问题2:解决In函数问题:判断C是否为运算符是返回1否则返回0*/
{
char ch[7]={'+','-','*','/','#','(',')'};
int i;
for(i = 0; i < 7; i++)
if(c == ch[i])
return 1;
return 0;
}
char Proceed(char op,char c) /*op为栈顶元素,c为当前读入的运算符,比较二者的优先级*/
{ /*问题1:解决Proceed函数*/
char ch;
if(op=='(' && c==')' || op=='#' && c=='#' )
ch = '=';
else
if(op=='+' || op=='-') /*栈顶元素为‘+’或‘-’的时候*/
switch(c)
{
case '+':
case '-':
case ')':
case '#': ch = '>'; break;
case '*':
case '/':
case '(': ch = '<';
}
else
if(op=='*' || op=='/') /*栈顶元素为‘*’或‘/’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case ')':
case '#': ch = '>'; break;
case '(': ch = '<';
}
else
if(op=='(') /*栈顶元素为‘(’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(': ch = '<'; break;
case '#': printf("Error!\n"); exit(0);
}
else
if(op==')') /*栈顶元素为‘)’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '#': ch = '>'; break;
case '(': printf("Error!\n"); exit(0);
}
else
if(op=='#') /*栈顶元素为‘#’的时候*/
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(': ch = '<'; break;
case ')': printf("Error!\n"); exit(0);
}
return ch;
}
/* 问题3:解决Operate函数*/
int Operate(int a,char r,int b) /*返回由aRb的值 */
{
int s;
int d1 = a;
int d2 = b; /*把字符ab变为对应数字*/
switch(r)
{
case '+': s = d1+d2; break;
case '-': s = d2-d1; break;
case '*': s = d1*d2; break;
case '/': s = d2/d1;
}
return (s+'0');
}
- 使用栈实现整型表达式的计算
- 栈实现表达式的计算
- 使用栈计算多项表达式的简单实现--java
- 栈实现表达式计算
- 表达式计算栈实现
- 栈实现后缀表达式的计算
- 借助栈实现表达式的计算
- 通过栈实现算术表达式的计算
- 【Java数据结构的实现】之系列三栈的实现(使用栈计算后缀表达式)
- 使用栈的表达式计算程序_Makefile
- 用栈来实现表达式的计算
- C++实现表达式的计算
- 整型占用字节的计算
- 用栈实现表达式计算
- 用栈实现表达式计算
- 表达式计算,输出后缀表达式,栈实现
- 使用堆栈计算后缀表达式--java实现
- 用栈实现整型数据的四则运算
- FlashP2P系统(客户端)系统分析和设计谍照
- 矢量叉积与折线段拐向判断---三角形顺逆判断
- CentOS 7 安装无线网卡驱动
- Winfrom用户自定义控件 实例1
- linux 下安装source -snavigator
- 使用栈实现整型表达式的计算
- 重置Visual studio 2012环境
- python核心编程笔记(3)
- 获取iOS设备名
- java多线程
- Hadoop任务即将可以运行在Docker容器中
- [gfirefly深入解析]--总体架构及demo讲解
- 应用 Valgrind 发现 Linux 程序的内存问题
- 将数据中的元素都向前移动一个位置,最后一个元素的值是原来第一个元素的值,然后输出这个数组。