1. 程式人生 > >C語言實現計算器 ---- 字尾表示式

C語言實現計算器 ---- 字尾表示式

對於平時我們書寫的算術表示式是

12 * ( 3 + 4 ) - 6 + 8 / 2

這種習慣的寫法是中綴表示式
但是計算機一般執行方式是字尾表示式,從左向右依次執行

12 3 4 + * 6 - 8 2 / +

這就是字尾表示式

這個是如何轉換的呢

有兩種
1.根據樹的遍歷
2.利用棧

今天主要說的是利用棧的轉換

中綴表示式轉換為字尾表示式

1.建立棧
2.從左向右順序獲取中綴表示式

a.數字直接輸出
b.運算子

遇到’ ( ‘直接入棧,遇到’ ) ‘將棧中‘ ( ‘之後入棧的全部輸出,同時‘ ( ‘出棧但是不輸出。其他符號將符號棧中的元素依次出棧並輸出,直到遇到比當前符號優先順序更低

的符號或者’ ( ‘,將當前符號入棧。

3.獲取完後,將棧中剩餘的符號依次輸出

例如:12 * (3 + 4) - 6 + 8 / 2
依次獲取:
12 ,是數字,直接輸出

字尾表示式:12
符號棧:

’ * ’ ,是運算子,入棧

字尾表示式:12
符號棧:*

’ ( ‘,左括號,直接入棧

字尾表示式:12
符號棧: * (

3 , 數字 ,輸出

字尾表示式:12 3
符號棧: * (

‘ + ’,運算子 ,入棧

字尾表示式:12 3
符號棧: * ( +

4 ,數字,輸出

字尾表示式:12 3 4
符號棧: * ( +

‘ )’,右括號,棧中元素依次出棧並輸出知道遇到左括號,並且左括號也要出棧且不輸出

字尾表示式:12 3 4 +
符號棧: *

‘ - ’,操作符,減號的優先順序低於乘號所以乘號出棧並輸出,此時站內沒有符號,減號入棧

字尾表示式:12 3 4 + *
符號棧: -

6 ,數字,輸出

字尾表示式:12 3 4 + * 6
符號棧: -

’ + ‘,操作符 ,優先順序與減號相同(也就是說沒有減號的優先順序高)所以減號出棧輸出,加號入棧

字尾表示式:12 3 4 + * 6 -
符號棧: +

8 ,數字 ,輸出

字尾表示式:12 3 4 + * 6 - 8
符號棧: +

‘ / ’,操作符,比減號的優先順序高直接入棧

字尾表示式:12 3 4 + * 6 - 8
符號棧: + /

2 ,數字,輸出

字尾表示式:12 3 4 + * 6 - 8 2
符號棧: + /
中綴表示式獲取完後,將棧中剩餘元素依次出棧輸出
字尾表示式:12 3 4 + * 6 - 8 2 / +
符號棧:

以上就是中綴表示式轉字尾表示式
轉換了之後也要知道字尾表示式是怎麼計算的
還是要利用棧

  • 依次遍歷
  • 檢測是否是數字,是數字就壓棧,是操作符從棧中依次取出當前運算元的右運算元和左運算元與當前操作符進行運算,結果壓棧。
  • 遍歷結束,執行結果就是棧頂元素。

    比如:12 3 4 + * 6 - 8 2 / +

  • 數字入棧

    棧:12 3 4

  • ’ + ’ ,遇到運算子從棧中依次取出當前運算元的右運算元和左運算元與當前操作符進行運算,結果壓棧 ,3 +4 =7

    棧:12 7

  • ’ * ’ , 運算子 ,12 * 7 =84

    棧:84

  • 6 ,入棧

    棧:84 6

  • ’ - ’ ,運算子 ,84 -6 =78

    棧:78

  • 8 2 ,入棧

    棧 : 78 8 2

  • ’ / ’ ,運算子 , 8 /2 =4

    棧:78 4

  • ’ + ’ ,運算子 78+4 =82

    棧:82

最後的結果就是:82

下面是一個關於字尾表示式計算的函式,可以參考:

結構體定義:


#define max 100
typedef char DataType;
typedef struct Stack //棧
{
    int top;
    DataType stack[max];
}Stack;

enum {Data,Add,Sub,Mul,Div}operate; //列舉

typedef struct Cell  
{
    enum operate op;
    int data;
}cell;

主要函式:


void StackInit(Stack* p) //棧的初始化
{
    assert(p);
    p->top = 0;
}
void StackPush(Stack* p, DataType data) //入棧
{
    assert(p);
    if (p->top <= max)
    {
        p->stack[p->top] = data;
        p->top++;
    }
    else
    {
        printf("stack fill\n");
    }
}
int StackPop(Stack* p)//出棧
{
    //int ch;
    assert(p);
    if (p->top != 0)
    {
        p->top--;
        //ch = p->stack[p->top];
        return p->stack[p->top];
    }

}
int StackTop(Stack* p)//取棧頂元素
{
    int n;
    assert(p);
    if(p->top)
    {
        n = p->top;
        return p->stack[n-1];
    }

    return 0;
}
int CalRPN(cell* RPN, int sz)//逆波蘭表示式(字尾表示式)
{
    int i = 0;
    Stack s;
    assert(RPN);
    StackInit(&s);
    for (; i < sz; i++)  //依次遍歷
    {
        int left = 0;//左運算元
        int right = 0;//右運算元
        switch (RPN[i].op) //swatch語句判斷表示式是數字還是字元,並跳轉到相應操作
        {
        case Data:
            StackPush(&s, RPN[i].data);      //入棧
            break;
        case Add:                             //加法
            right = StackPop(&s);             //從棧中獲取運算元
            left = StackPop(&s);
            StackPush(&s, right + left);      //結果入棧
            break;
        case Sub:                               //減法
            right = StackPop(&s);
            left = StackPop(&s);
            StackPush(&s, left - right);
            break;
        case Mul:                            //乘法
            right = StackPop(&s);
            left = StackPop(&s);
            StackPush(&s, left * right);
            break;
        case Div:                            //除法
            right = StackPop(&s);
            left = StackPop(&s);
            if (0 == right)
                printf("除數非法\n");
            else
                StackPush(&s, left / right);
            break;
        }
    }
    return StackTop(&s);
}

測試:

void RPNTest()
{   //這個陣列是cell型別的在上面有相應的結構體,結構體有兩個成員,一個是列舉型別的變數,一個是整形變數;
    cell RPN[] = { {Data,12},{Data,3},{Data,4},{Add,0},{Mul,0},{Data,6},
                   {Sub,0},{Data,8},{Data,2},{Div,0},{Add,0} };
    int sz = sizeof(RPN) / sizeof(RPN[0]);
    int ret = CalRPN(RPN, sz);
    printf("%d\n", ret);
}

相關推薦

C語言實現計算器 ---- 字尾表示式

對於平時我們書寫的算術表示式是 12 * ( 3 + 4 ) - 6 + 8 / 2 這種習慣的寫法是中綴表示式 但是計算機一般執行方式是字尾表示式,從左向右依次執行 12 3 4 + * 6 - 8 2 / + 這就是字尾表示式

資料結構之---C語言實現棧的表示式求值(表示式樹)

利用棧實現表示式樹這裡我一共有兩種思路: part one: 首先判斷輸入表示式的每個字元,如果遇到運算子,不壓棧, 接著彈出兩個棧頂的元素,進行元素,接著把結果壓棧。 程式碼: //棧實現表示式 //思路:此程式的思路是,讀取輸入的字串,然後判斷每個字元, //當遇到

c語言實現計算器小程式

計算器功能就是“+”“-”“*”“/”,利用switch語句和自帶的計算功能實現就行了 程式程式碼: #include<stdio.h> int main() { int num1,num2; char function; printf("please inp

C語言實現計算器(包含加減乘除和括號)

#include <stdio.h>                          /*包含標頭檔案*/   #include <stdlib.h> #define MAX_SIZE 1024                       /*陣列

C語言實現整數四則運算表示式的計算

一、問題重述 【問題描述】 從標準輸入中讀入一個整數算術運算表示式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。計算表示式結果,並輸出。 要求: 1、表示式運算子只有+、-、*、/,表示式末尾的’=’字元表示表示式輸入結束,表示式中可能會出現空格; 2、

使用c語言實現字尾表示式計算器

使用棧來進行字尾表示式計算,流程:從前向後讀取字尾表示式的專案,遇到數值壓入棧中,遇到運算子pop出棧頂的兩項做運算,運算結果再放入棧中直到= 例子:求字尾表示式4x*2x*a-c*+=? 1.把4和x壓入棧中接下來遇到了運算子*把4和x取出做*運算得到4x放入棧中,此時

利用字尾表示式構建一顆表示式樹——C語言實現

表示式樹是指所有葉子結點為運算元,根節點和中間節點為操作符的樹。如果操作符是二元運算子,那麼構建出來的二叉樹為為一顆二叉樹。 構建一顆表示式的演算法如下: 從第一個符號開始,一次讀取一個字尾表示式中的符號。如果符號是運算元,那麼建立一個單節點樹,並將一個指向它的指標入棧(注意這裡棧中存的

C語言實現括號匹配,中綴表示式字尾表示式並計算的演算法

1.將中綴表示式轉換為字尾表示式的演算法: (1) 初始化兩個棧:運算子棧S1和儲存中間結果的棧S2; (2) 從左至右掃描中綴表示式; (3) 遇到運算元時,將其壓入S2; (4) 遇到運算子時,比較其與S1棧頂運算子的優先順序: Ø (4-1)如果S1為空,或棧頂運算子

計算字尾表示式——C語言實現

程式相對簡單易懂,執行程式,在命令列中輸入:123+*#(注意:由於輸入字元,以‘#’結束)輸出:5.000000#include <stdio.h> #include <stdlib.h> typedef struct { float *base

C語言 實現中綴表示式字尾表示式並求值

大一菜鳥,初學程式設計,這是我的第一篇部落格,希望能用部落格記錄我的成長之路。 初學資料結構,剛接觸連結串列和棧,看到有中綴表示式轉字尾的題就試著實現了一下。下面貼上程式碼。因為使用的是字元型變數,所以只能計算個位數。 /* 堆疊練習——中綴表示式轉

0x00資料結構——C語言實現(棧+字尾表示式計算)

0x00資料結構——C語言實現(棧) 棧的實現 /* 棧(tack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。 對棧的基本操作有Push(進棧)和Pop(出棧)。 Functions: (在連結串列中增加

表示式計算器(逆波蘭法)棧操作(C語言實現

可能很多的同學在學資料結構的時候。說到棧,都會有一道很經典的題目,那就是用棧來實現計算器。我們都知道普通的計算寫起來是很簡單的,但是如果涉及到左右括號以及加減乘除組成的運算式的時候則寫起程式時便不那麼容易了。 比如:(1+(2*(1+3)/2)+10)

C語言實現簡化的正則表示式

語法: 正則表示式和待匹配字串都是一行 “^” 標記正則表示式的開始 “$” 標記正則表示式的結束 “*” 匹配前面的子表示式零次或多次 “+” 匹配前面的子表示式一次或多次 “?” 匹配前面的子表示式零次或一次, 當該字元緊跟在任何一個其他限制符(*,+,?

[原始碼和文件分享]基於C#語言計算器的設計與實現

一 需求分析 利用c#語言實現一個計算器程式,包括普通計算器模式、科學計算器模式;實現實數(包括正數、負數、0)的加、減、乘、除、平方等基本遠算,並實現非負數的開方運算。 二 程式設計與實現 首先設計主窗體,包括兩個TextBox用來顯示資料,使用資料繫結實現,在Model中實現INot

C語言中綴轉字尾(棧的實現

#include<stdio.h> #include<stdlib.h> #include<string.h> #define maxsize 20 typedef struct st2 { int top; char str[maxsize];

C語言實現個位數四則運算計算器

學習C語言不久,設計了一個簡單的計算器,要求輸入數字均為個位數(老師的要求= =),可加減乘除,帶糾錯功能。 #include<stdio.h> void main() { { printf("請輸入四則運算式子 (要求:不能有括號,均為個位數

“棧”的典型應用—表示式求值(C語言實現)【轉】

我們都知道算術四則運算的運算規則是: 先乘除,後加減。 從左到右計算 先算括號內,再算括號外 表示式組成 任何一個表示式都有運算元、運算子和界定符組成。 運算元即可以是常量,也可以是被說明為變數或常量的識別符號。 運算子可以分為算術運算,關係運算和邏輯運

棧的操作和c語言實現算術表示式求值

</pre><p><span style="font-size:18px;">棧是一種特殊的線性表,按照“後進先出”的原則處理資料。</span></p><p><span style="font

資料結構中用棧實現表示式求值(c語言實現

/* 該程式完成了個位數的各類表示式求值 運用了資料結構中的棧及對棧操作的各類函式,操作全用指標完成 如輸入 2+3*(3+3*1)#  輸出結果為 20 經測試個位數的表示式運算結果均正確 */ #include<stdio.h> #include<std

離散數學:驗證P,Q兩個邏輯表示式是否邏輯等價(C語言實現)

一、程式通過編譯,並實現兩個命題的各種邏輯運算 二、任意輸入字串P和Q邏輯表示式的合法性檢查 三、利用真值表方法驗證他們的等價性 一、演算法分析 ①    求任意一個命題公式的真值表,,根據真值表驗證他們的等價性 C語言演算法: 首先是輸入一個合理的式子,然後從式子中查找