作者hck13kimo (清心寡愈)
看板C_and_CPP
标题[问题] 求救..中序转後序计算程式...
时间Fri Mar 27 16:40:51 2009
小弟是C语言初学者
这个学期修资料结构...
老师给的第一个作业是要写一个中序转後序的计算程式
要用两个堆叠一个放运算元..一个放运算子
还要有一个子作业是要写出一个副程式
可以判断多位数的运算
我已经完全没办法了= = ...
写了一个大概的程式...
可是对於strut要怎麽写入跟读取
push,pop的值要怎麽设定...
第一个C就写这个真的好困难阿= =
可是我又不想放弃...
这是我的第一个C...
所以可能会有很多忘了打;
或者离奇的错误...
可是作业迫在眉睫...
希望各位可以鞭小力一点...
冒着会被骂到臭头的危险..
把程式码放上来给各位大德看看...
希望各位可以帮助我QQ"
--------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#define Stacksize 80
#define TRUE 1
#define FALSE 0
int input_infix(char); // 中序转後序
int priority(int); // 决定运算子优先顺序
void evalute_subvalue(int); //计算程式
void empty(int);//检查堆叠是否为empty
void Push(int, int);//放值进堆叠
int Pop(int);//拿值出堆叠
////////////////////////////////////
/* 运算元堆叠宣告 */
////////////////////////////////////
struct stack_operand {
int top;
int stack[Stacksize];
};
////////////////////////////////////
/* 运算子堆叠宣告 */
////////////////////////////////////
struct stack_operator {
int top;
int stack[Stacksize]
};
////////////////////////////////////
/* 主程式 */
////////////////////////////////////
int main(void) {
int input[Stacksize];
printf("输入运算式:");
scanf("%s", input);
input_fix(input);
system("pause");
return 0;
}
////////////////////////////////////
/* 中序转後序 */
////////////////////////////////////
int input_infix(int* infix) {
int i=0;
struct stack_operand ope_rand
struct stack_operator oper_ator
op_erand.top = -1
oper_ator.top = -1
int symb;
int op;
while(!'\0') {
symb = infix[i];
if (symb = '+'||'-'||'*'||'/')
if (!Overflow(oper_ator))
Push(*oper_ator, symb);
else
printf("stack is overflow");
break;
else{
if
(symb == ')'){
while((op = Pop(*oper_ator))!='('){
evalute_subvalue(op);
continue;
}
else
while (priority(symb) <= oper_ator->top){
op = Pop(*ope_rand);
evalute_subvalur(op);
}
Push(*oper_ator, int symb)
}
}
while(!Empty(oper_ator)){
op = int Pop(*ope_rand);
evalute_subvalue(op);
}
printf("ans:%c",*ope_rand->stack[0]);
}
////////////////////////////////////
/* 判断运算元优先顺序 */
////////////////////////////////////
int priority(int symb)
{
int p;
switch(op) {
case '+': case '-':
p = 1;
break;
case '*': case '/':
p = 2;
break;
default:
p = 0;
break;
}
return p;
}
////////////////////////////////////
/* 计算函式 */
////////////////////////////////////
void evalute_subvalue(int op)
{
int a,b;
int op, new_value;
b = int Pop(*ope_rand);
a = int Pop(*ope_rand);
switch(op) {
case '+':
return new_value = a + b;
case '-':
return new_value = a - b;
case '*':
return new_value = a * b;
case '/':
return new_value = a / b;
}
Push(*ope_rand , new_value);
}
////////////////////////////////////
/* empty 判断 */
////////////////////////////////////
void empty(int ps)
{
if(ps.top == -1)
return(TRUE);
else
return(FALSE);
}
////////////////////////////////////
/* voerflow 判断 */
////////////////////////////////////
void overflow(struct stack ps)
{
if(ps.top == Stacksize - 1)
return(TRUE);
return(FALSE);
}
////////////////////////////////////
/* PUSH */
////////////////////////////////////
void Push(struct stack *ps , int symb)
{
ps->stack[++(ps->top)] = symb;
return;
}
////////////////////////////////////
/* POP */
////////////////////////////////////
int Pop(int* ps)
{
return(ps->stack[ps->top --]);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.139.132.70
1F:→ luckfox:这程式是你写的吗?我看是从网路上还是书上剪下来的吧 03/27 17:32
2F:→ hck13kimo:我是照着课本上的虚拟码写的... 03/27 17:48
3F:推 Ebergies:第一个就写这个... 不是你老师有问题就是你有问题... 03/27 17:51
4F:→ hck13kimo:这个原因很复杂..但是作业还是得交... 03/27 20:24
5F:推 zptdaniel:去借一本资料结构的书.里面会有详细的解说. 03/27 23:57
6F:→ zptdaniel:我想你们课本应该是用所谓的圣经本 03/27 23:57
7F:→ zptdaniel:去找本中文书来辅助吧..既然是初学者的话 03/27 23:57