n棧在表示式計算過程中的應用 :建立運算元棧和運算子棧。運算子有優先順序。規則:
n自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。
n當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。
n左括號一律進運算子棧,右括號一律不進運算子棧,取出運算子棧頂運算子和運算元棧頂的兩個運算元進行運算,並將結果壓入運算元棧,直到取出左括號為止。
#include "calculator.h"
#include int main()
i++; }
int tmp = 0;
while(*pstr)
pstr++; }
if(tmp == 1)
pstr = str;
int flag = 0;
while(*pstr)
else
if(*pstr == '(')
else if(*pstr == ')')
else
oppush(s,*pstr);
}pnum = pstr + 1;
} pstr++; }
if(flag == 1)
while(operate(s));
int result;
numpop(s,&result);
printf("result = %d\n",result);
return 0;
}
#ifndef __calculator_h__
#define __calculator_h__
#include "error.h"
#define true 1
#define false 0
typedef int num;
typedef char op;
typedef struct _numnode
numnode;
typedef struct _opnode
opnode;
typedef struct _linkstack
linkstack;
//建立鏈式棧
linkstack *create_stack();
//判斷運算元是不是空棧
int numempty(linkstack *s);
//判斷操作符是不是空棧
int opempty(linkstack *s);
//運算元進棧
int numpush(linkstack *s,num x);
//操作符進棧
int oppush(linkstack *s,op x);
//運算元出棧
int numpop(linkstack *s,num *x);
//操作符出棧
int oppop(linkstack *s,op *x);
//取操作符棧頂元素
int getoptop(linkstack *s,op *x);
int cmp_op(linkstack *s,op op2);
int operate(linkstack *s);
#endif // __calculator_h__
#include "calculator.h"
#include linkstack *create_stack()
s->numtop = null;
s->optop = null;
return s;
}int numempty(linkstack *s)//判斷num是否空棧
return s->numtop == null;
}int opempty(linkstack *s)
return s->optop == null;
}int numpush(linkstack *s,num x)
numnode *numnode =(numnode *)malloc(sizeof(numnode) / sizeof(char));
if(numnode == null)
numnode->data = x;
numnode->next = s->numtop;
s->numtop = numnode;
return true;
}int oppush(linkstack *s,op x)
opnode *opnode =(opnode *)malloc(sizeof(opnode) / sizeof(char));
if(opnode == null)
opnode->data = x;
opnode->next = s->optop;
s->optop = opnode;
return true;
}int numpop(linkstack *s,num *x)
if(numempty(s))
numnode *p = s->numtop;
*x = p->data;
s->numtop = p->next;
free(p);
return true;
}int oppop(linkstack *s,op *x)
if(opempty(s))
opnode *p = s->optop;
*x = p->data;
s->optop = p->next;
free(p);
return true;
}int getoptop(linkstack *s,op *x)
if(opempty(s))
*x = s->optop->data;
return true;
}int cmp_op(linkstack *s,op op2)
if(opempty(s))
char op1;
getoptop(s,&op1);
switch(op1) }
int operate(linkstack *s)
if(opempty(s))
char op1;
oppop(s,&op1);
if(op1 == '(')
int num1,num2;
numpop(s,&num1);
numpop(s,&num2);
int result;
switch(op1)
numpush(s,result);
return true;
}
#ifndef __error_h__
#define __error_h__
#include #define error -1
#define empty_stack -2
#define full_stack -3
#define malloc_error -4
#define full_queue -5
#define empty_queue -6
#define input_error -7
int errno;
void myerror(char *str);
char *mystrerror(int num);
#endif //__error_h__
#include "error.h"
void myerror(char *str)
char* mystrerror(int num)
}
Python 練習 計算器
import re def format string s 對表示式進行格式化 s s.replace s s.replace s s.replace s s.replace s s.replace s s.replace return s def check expression s 對表示式進行...
練習 製作計算器
自製乙個計算器,實現計算器的基本功能,按順序依次計算,可進行拓展練習新增其他內容,盡可能完善 思路 1 介面布局 2 數字鍵功能 3 運算子功能 4 清屏鍵 退格鍵 小數點等功能 5 查缺補漏 檔案 using system using system.collections.generic usin...
練習 WinForm 計算器
介面設計 練習 計算器 數字鍵的操作 private void button27 click object sender,eventargs e 追加 else 點選了數字 prev 1 運算子的操作 private void button26 click object sender,eventar...