數據結構之棧(C語言版)

寫在前面:

實驗報告留念完全是因為都是大學期間辛辛苦苦做的,一下子刪掉實在心痛,所以在簡書保留下來。

值得一提的是本人數學系學生,所用程序語言多是matlab,少部分C語言和JAVA,并且水平一般。由于僅僅是實驗報告的留念,有部分內容缺失實屬正常~

如果有值得參考之處自然不錯,若有錯誤也希望大家指出~


實驗要求
  • 實現順序棧的抽象數據類型
  • 實現順序棧的建立、銷毀、取棧頂元素、壓棧、彈棧的運算
  • 給出表達式的括號匹配檢測算法
  • 創建運算符棧和運算數棧
  • 實現有一定通用性的程序,實現一個四則運算表達式的求解
實驗代碼
  • 實現順序棧的抽象數據類型
typedef struct
{   SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
  • 實現順序棧的建立、銷毀、取棧頂元素、壓棧、彈棧的運算
//建立
Status InitStack(SqStack &s)
{   
    s.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!s.base) exit(overflow);
    s.top=s.base;
    s.stacksize=STACK_INIT_SIZE;
    return OK;
}
//銷毀
void DestroyStack(SqStack &s)
{   
    free(s.base);
    cout<<"Success to destroy!";
}
//取棧頂元素
Status GetTop(SqStack s,SElemType e)
{
    if(s.top==s.base) return error;
    e=*(s.top-1);
    return OK;
}
//壓棧
Status Push(SqStack &s,SElemType e)
{
    if(s.top-s.base>=s.stacksize)
    {
        s.base=(SElemType *)realloc(
            s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!s.base)  exit(overflow);
        s.top=s.base+s.stacksize;
        s.stacksize+=STACKINCREMENT;
    }//end of if
    *s.top=e;
    s.top++;
    return OK;
}
//彈棧
Status Pop(SqStack &s,SElemType &e)
{
    if(s.top==s.base) return error;
    --s.top;
    e=*s.top;
    return OK;
}
  • 給出表達式的括號匹配檢測算法
Status matching(string exp)
{
    SqStack s;
    InitStack(s);
    SElemType e;
    int state=1,i=0,len;

    len=exp.length();
    while(i<len&&state==1)
        switch(exp[i])
    {
        case '(':
        case '[':
        case '{':
            {Push(s,exp[i]);i++;break;}
        case ')':
            {
                GetTop(s,e);
                if(!StackEmpty(s)&&e=='('){Pop(s,e);i++;}
                else state=0;
                break;
            }
        case ']':
            {
                GetTop(s,e);
                if(!StackEmpty(s)&&e=='['){Pop(s,e);i++;}
                else state=0;
                break;
            }
        case '}':
            {
                GetTop(s,e);
                if(!StackEmpty(s)&&e=='{'){Pop(s,e);i++;}
                else state=0;
                break;
            }
        default: i++;
    }//end of switch
    if(StackEmpty(s)&&!state) return OK;
    else  return error;
}
  • 創建運算符棧和運算數棧
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
using namespace std;
stack<char> optr;    // 操作符棧
stack<double> opnd;  // 操作數棧
  • 實現有一定通用性的程序,實現一個四則運算表達式的求解
/* 利用兩個棧進行模擬計算 */
double Compute()
{
    stack<char> optr;    // 操作符棧
    stack<double> opnd;  // 操作數棧

    optr.push('#');
    int len = strlen(s);
    bool is_minus = true;  // 判斷'-'是減號還是負號

    for (g_pos = 0; g_pos < len;)
    {
        //1. 負號  
        if (s[g_pos] == '-' && is_minus)  // 是負號
        {
            opnd.push(0);
            optr.push('-');
            g_pos++;
        }
        //2. 是右括號 ) 
        else if (s[g_pos] == ')')
        {
            is_minus = false;
            g_pos++;

            while (optr.top() != '(')
            {
                double a2 = opnd.top();
                opnd.pop();
                double a1 = opnd.top();
                opnd.pop();
                char op = optr.top();
                optr.pop();

                double result = Operate(a1, op, a2);
                opnd.push(result);
            }

            optr.pop();  // 刪除'('  
        }
        //3. 數字  
        else if (s[g_pos] >= '0' && s[g_pos] <= '9')
        {
            is_minus = false;
            opnd.push(Translation(g_pos));
        }
        //4. ( 左括號  
        else if (s[g_pos] == '(')
        {
            is_minus = true;
            optr.push(s[g_pos]);
            g_pos++;
        }
        //5. + - * / 四種  
        else
        {
            while (GetLevel(s[g_pos]) <= GetLevel(optr.top()))
            {
                double a2 = opnd.top();
                opnd.pop();
                double a1 = opnd.top();
                opnd.pop();
                char op = optr.top();
                optr.pop();

                double result = Operate(a1, op, a2);
                opnd.push(result);
            }

            optr.push(s[g_pos]);
            g_pos++;
        }
    }

    while (optr.top() != '#')
    {
        double a2 = opnd.top();
        opnd.pop();
        double a1 = opnd.top();
        opnd.pop();
        char op = optr.top();
        optr.pop();

        double result = Operate(a1, op, a2);
        opnd.push(result);
    }

    return opnd.top();
}

其他相關文章:
數據結構之樹的相關問題
數據結構之圖、廣度優先搜索以及佛洛依德算法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。