1. 程式人生 > >資料結構——c語言描述 第三章 (2)棧的練習(四則運算的實現)

資料結構——c語言描述 第三章 (2)棧的練習(四則運算的實現)

棧的基本概念和實現我在上一篇文章中實現了,現在做一下練習,一個簡單的四則運算的實現,還是比較簡單的,我並沒有再往下實現括號的四則運算,這個都是次要的,主要是掌握棧的操作方法,和一些基本的注意事項,其實這個程式碼我之前刪除了又重寫了一邊,第一遍在實現的過程中對自己的程式碼並沒有感到滿意。在這個練習的過程中自己還是學到了很多的細節上的問題,有些東西只有自己動手去做才會明白其中的重要的部分。多多實踐才是提高的方法,部落格就是監督自己的手段之一。

下面上程式碼:

#include <stdio.h>
#include "seqstack.h"
#include <string.h>
#include <stdlib.h>

#define BUF_SIZE 1024

SeqStack stack_number;
SeqStack stack_char;

long char_to_long (char *c , int count) ;
int is_vaild (char *buf , int count) ;
long search_buf (char * buf , int count) ;
long count_res (long m , long n , char op) ;

int main () {
    int count = 0;
    char c;
    char buf[BUF_SIZE];
    long res;

    init_stack (&stack_char);
    init_stack (&stack_number);

    while ((c = getchar()) != '#') {
        if (count == BUF_SIZE - 1) {
            printf ("the buf is full\n");
            break;
        }
        else {
            buf[count] = c;
            count++;
        }
    }
    if (!is_vaild (buf , count)) {
        printf ("the input string error\n");
        return 1;
    }
    res = search_buf(buf , count);
    printf ("the res is %ld\n" , res);
}

long search_buf (char *buf , int count) {
    char *point_arr[BUF_SIZE];
    int i , point_count;
    char temp;
    long op;
    long s , t ;
    char op_arr[BUF_SIZE];
    int op_count = 0;
    long data_arr[BUF_SIZE];
    int data_count = 0;
    int length;
    long res;

    point_arr[0] = buf-1;
    point_count = 1;

    for (i = 0 ; i < count ; i++) {
        temp = *(buf+i);
        if (temp == '*' || temp == '\\' || temp == '+' || temp == '-') {
            point_arr[point_count] = buf+i;
            point_count++;
        }
    }
    point_arr[point_count] = buf+count;
    point_count++;

    for (i = 0 ; i < point_count - 2 ; i++) {
        op_arr[op_count] = *point_arr[i+1];
        op_count++;
    }
    for (i = 0 ; i < point_count - 1 ; i++) {
        length = point_arr[i+1] - (point_arr[i]+1);
        data_arr[data_count] = char_to_long(point_arr[i]+1 , length);
        data_count++;
    }
    //above all the search is ok
    push (&stack_number , data_arr[0]);

    for (i = 0 ; i < op_count ; i++) {
        if (op_arr[i] == '+' || op_arr[i] == '-') {
            push (&stack_char , (long)op_arr[i]);
            push (&stack_number , data_arr[i+1]);
        }else if (op_arr[i] == '*' || op_arr[i] == '\\') {
            pop (&stack_number , &s);
            t = count_res (s , data_arr[i+1] , op_arr[i]);
            push (&stack_number , t);
        } 
    }
    pop (&stack_number , &res);
    while (!is_empty (&stack_char)) {
        pop (&stack_char , &op);
        pop (&stack_number , &s);
        res = count_res (s , res , (char)op);
    }
    return res;
}

int is_vaild (char *buf , int count) {
    int i;
    char temp;
    int flag = 1;

    for (i = 0 ; i < count ; i++) {
        temp = *(buf+i);

        if ((temp >='0' && temp <='9') || temp == '+' || temp == '-' || temp == '*' || temp == '\\')
            continue;
        else {
            flag = 0;
            break;
        }
    }
    return flag;
}

long char_to_long (char *c , int count) {
    int i;
    long res = 0;
    int temp;

    for (i = 0 ; i < count ; i++) {
        if (*(c+i) > '9' || *(c+i) < '0') {
            printf ("the input seq error\n");
            return -1;
        }
        temp = *(c+i) - '0';
        res *= 10;
        res += temp;
    }
    return res;
}

long count_res (long m , long n , char op) {
    long temp;
    switch (op) {
        case '+':
            return m+n;
        case '-':
            return m-n;
        case '*':
            return m*n;
        case '\\':
            return (m/n);
        default:
            return -1;
    }
}
主要思路上,先對輸入的字串(以字元'#'結尾)進行掃描,將掃描到的符號和數字都分別放到陣列當中,再進行進棧,出棧操作,判斷優先順序,將乘號和除號先進行運算,運算完的值再進行進棧操作就可以了。這個就不進行很詳細的註釋了。哈哈我真懶XD!

相關推薦

資料結構——c語言描述 2練習四則運算實現

棧的基本概念和實現我在上一篇文章中實現了,現在做一下練習,一個簡單的四則運算的實現,還是比較簡單的,我並沒有再往下實現括號的四則運算,這個都是次要的,主要是掌握棧的操作方法,和一些基本的注意事項,其實這個程式碼我之前刪除了又重寫了一邊,第一遍在實現的過程中對自己的程式碼並沒

資料結構——c語言描述 3十字連結串列儲存稀疏矩陣

這段時間在看c++primer,深切的體會到了c++是多麼複雜的一門語言,但是在c++中又包含著c語言所不擁有的很多特性,不說那麼多了,等我囫圇吞棗地把它看完我應該要開始更新c++的部落格了,當然這本書我是會更新完的,哈哈。 第五章的最後一個內容,用十字連結串列儲存係數矩陣

資料結構( Pyhon 語言描述 ) — —9:列表

概念 列表是一個線性的集合,允許使用者在任意位置插入、刪除、訪問和替換元素 使用列表 基於索引的操作 基本操作

C語言-函式-2

第2節 函式呼叫   函式呼叫一般有兩種方式,一種是形參不會影響實參的傳值呼叫,另一種是形參會影響實參的傳址呼叫。 傳值呼叫   傳值呼叫是將實參的值傳入函式體中,傳入的不過是實參的副本,不會改變實參。這個在上一節已經講過其中的原因正式因為C語言副本傳參的這個特

[轉載]演算法精解(C語言描述) 3 讀書筆記

第3章 遞迴 1、基本遞迴 假設想計算整數n的階乘,比如4!=4×3×2×1。 迭代法:迴圈遍歷其中的每一個數,然後與它之前的數相乘作為結果再參與下一次計算。可正式定義為:n! = (n)(n-1)(n-2)…(1)。 遞迴法:將n!定義為更小的階乘形式。可以正式定義為:

資料結構 C++ 語言描述》電子書下載 -百度網盤 高清版PDF格式

      作者:William Ford,William Topp 【譯者】 劉衛東 沉官林 出版日期:1999-9-1 出版社:清華出版社 頁數:708 ISBN:7-302-03160-6 檔案格式:PDF 檔案

JAVA資料結構和演算法:和佇列

棧 棧是限制僅在一個位置上進行插入和刪除的線性表。允許插入和刪除的一端為末端,稱為棧頂。另一端稱為棧底。不含任何資料元素的棧稱為空棧。棧又成為後進先出(LIFO)表,後進入的元素最先出來。 首先,棧是一個線性表,元素之間具有線性關係,即前驅後繼關係,其次,

資料結構與演算法分析—— 表、和佇列1

3.1 抽象資料型別 抽象資料型別(ADT):一些操作的集合 理解:數學的抽象;模組化設計;沒有實際的資料,只是一種結構,一種對於資料儲存的思想。 3.2 表ADT 定義:空表、後繼、前驅 操作:PrintList、MakeEmpty、Find、Fin

C語言程式設計習題

3.1 (1)(float)(a*b)/2)=18.000000   (int)%(int)y=2 (2)P=32 q=80 x=33 y=80 3.2 1#include<stdio.h> 2main() 3{ 4      intx=123,a,b,c,su

資料結構C語言描述———用順序佇列判斷迴文數

所謂迴文數就是正著讀跟倒著讀一樣,比如abcba。用佇列判斷迴文數需要一個棧作為中間量,把一串數字分別進棧和入隊,按照棧先進後出和佇列先進先出的原則,如果棧頂元素跟隊頭元素相等,則棧頂元素出棧同時隊頭元素出隊,接著往下比較,知道必到該串數字的長度的一半,如果之前出棧的元素和

資料結構 C語言 嚴蔚敏版 演算法2.1

//已知線性表La和Lb的資料元素按值非遞減有序排列,現要求將La和Lb歸併為一個新的線性表Lc,且Lc中的資料元素仍按值非遞減有序排列。 #include <stdio.h> #include <stdlib.h> #include <ma

資料結構--C語言--逆序建立單鏈表,遍歷單鏈表,在單鏈表5個元素前插入一個值為999的元素,刪除單鏈表5個元素

#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define LEN sizeof(struct LNode) struct LNode{ int data; struct LNode

資料結構C語言第二迷宮

轉自未空blog   //我剛開始對STACK的記憶體分配那有點問題,後來用這個程式碼除錯了下,感覺有點明白了,   地址由高到低分配,然後程式碼中的base和top剛開始指向地址最低的地方,記憶體不夠時重新在原有基礎上新增記憶體,top指向原有的棧頂,然後繼續

Java程式語言基礎 選擇結構

一.if選擇結構 1.什麼是if選擇結構:if選擇結構就是根據條件判斷後在做處理。 二.if選擇結構有哪些: 1.基本的if選擇結構 2.if-else選擇結構 3.多重if選擇結構 4.巢狀選擇結構 課後作用總結: 一.買彩票 如果體彩中了500萬,我買車、資

資料結構(C語言版)》嚴蔚敏---第一緒論

資料結構 資料結構主要研究非數值計算問題,資料結構是一門研究非數值計算程式設計中的操作物件,以及這些物件之間關係和操作的學科。 資料結構是相互之間存在一種或多種特定關係的資料元素的集合。 資料結構包括邏輯結構和儲存結構兩個層次。 邏輯結構的四種基本關係: 集合結構 線性結構 樹結構 圖

讀書筆記之《Go程式設計語言》--- 基本資料

基本資料 基礎型別:數值型別、字串、布林 集合型別:陣列、結構體 引用型別:指標、slice、map、函式、通道 介面型別:第七章討論 整數 go數值型別包含了幾種不同大小的整數、浮點數和複數 宣告:var name int 知識點: 有符

資料結構實驗2.實現的各種基本運算

(1)初始化棧s。 (2)判斷棧s是否為空。 (3)依次進棧元素a,b,c,d,e。 (4)判斷棧s是否為空。 (5)輸出出棧序列。 (6)判斷棧s是否為空。 (7)釋放棧。 #include <stdio.h> #include &l

C#認證考試

pac png strip form ips pub 選擇 背景 第三章 ps:因為前面請假,沒能在規定時間做出總結,現在補上 如果你看了第三章的內容,你會發現第三章在著重跟我們講解對Windows窗體的設計,其中包括窗體背景、前景色、字體顏色、位

數據結構復習【

del 一次 3.2 alt 技術分享 求值 == 字符 image (1)掌握棧的相關概念、特點和基本操作(入棧、出棧、判棧空、獲取棧元素等)。 棧:限制只能在表的一端進行插入和刪除的線性表。 允許插入和刪除的一端,稱為棧頂(top)。 不允許插入和刪除的另一端,稱為棧底

C Primer Plus 編程練習

思考 reat enter span n) 試驗 val unsigned 小數 1.通過試驗(即編寫帶有此類問題的程序)觀察系統如何處理整數上溢、浮點數上溢和浮點數下溢的情況。 #include<stdio.h> int main(void) {