LinuxC小練習 計算器

2021-08-04 11:03:24 字數 3919 閱讀 6278

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...