c語言棧演算法,c語言函數棧

本文目錄一覽:

C語言計算棧

#include stdio.h

double readnumber(char a[],int *i)//將數字字元轉變成相應的數

{

double x=0.0;

int k=0;

while(a[*i]=’0’a[*i]=’9′)

{

x=x*10+a[*i]-‘0’;

(*i)++;

}

if(a[*i]==’.’)

{

(*i)++;

while(a[*i]=’0’a[*i]=’9′)

{

x=x*10+a[*i]-‘0’;

(*i)++;

k++;

}

}

while(k!=0)

{

x=x/10.0;

k=k-1;

}

return x;

}

double yunsuan(char a[])//求一個後綴表達式的值

{

double obst[100],b,c;//操作數棧

int top=0,i=0;

while(a[i]!=’\0′)

{

if(a[i]=’0’a[i]=’9′)

obst[top++]=readnumber(a,i);

else if(a[i]==’ ‘) i++;

else if(a[i]==’+’)

{

b=obst[–top];

c=obst[–top];

obst[top++]=b+c;

i++;

}

else if(a[i]==’-‘)

{

b=obst[–top];

c=obst[–top];

obst[top++]=c-b;

i++;

}

else if(a[i]==’*’)

{

b=obst[–top];

c=obst[–top];

obst[top++]=b*c;

i++;

}

else if(a[i]==’/’)

{

b=obst[–top];

c=obst[–top];

obst[top++]=c/b;

i++;

}

}

return obst[0];

}

int pd(char op)//判斷一個字元是不是運算符

{

switch(op)

{

case ‘+’:

case ‘-‘:

case ‘*’:

case ‘/’:return 1;

default :return 0;

}

}

int priority(char op)//求運算符的優先順序

{

switch(op)

{

case ‘\0’:return -1;

case ‘(‘:return 0;

case ‘+’:

case ‘-‘:return 1;

case ‘*’:

case ‘/’:return 2;

default:return -1;

}

}

void charge(char a[],char b[])//將中綴表達式轉換等價的後綴表達式

{

int i=0,j=0;

char opst[100];

int top,t;

top=0;

opst[top]=’\0′;

top++;

while(a[i]!=’\0′)

{

if(a[i]=’0’a[i]=’9’||a[i]==’.’)

b[j++]=a[i];//遇到數字和小數點直接寫入後綴表達式

else if(a[i]=='(‘)//遇到左括弧進入操作符棧

{

opst[top]=a[i];

top++;

}

else if(a[i]==’)’)

{

t=top-1;

while(opst[t]!='(‘)

{//'(‘之前出棧

b[j++]=opst[–top];

t=top-1;

}

top–;

}

else if(pd(a[i]))//’+’,’-‘,’*’,’/’

{

b[j++]=’ ‘;//用空格分開兩個操作數

while(priority(opst[top-1])=priority(a[i]))

b[j++]=opst[–top];

opst[top]=a[i];

top++;

}

i++;

}

while(top) b[j++]=opst[–top];

}

int main()

{

char a[100],b[100];

double jieguo;

printf(“\n\t請輸入算術表達式:”);

scanf(“%s”,a);

charge(a,b);

jieguo=yunsuan(b);

printf(“\t表達式運算的結果為:%lf”,jieguo);

return 0;

}

棧的操作演算法c語言實現

#includeiostream

using namespace std;

#define STACK_INIT_SIZE 100

#define STACKINCREASE 1ypedef struct{

int *base;

int *top;

int stacksize;

}SqStack;

int InitStack (SqStack S)//構造空棧

{

S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));

if(!S.base)exit(OVERFLOW);//存儲分配失敗

S.top=S.base;

return 0;

}

int Push(SqStack S,int e)//插入新的元素為新的棧頂元素

{

if(S.top-S.base=S.stacksize)//z棧滿,追加存儲空間

{

S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREASE)*sizeof(int));

if(!S.base)exit(OVERFLOW);//存儲失敗

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREASE;

}

*S.top++ =e;//認為是先賦值再加加?

return 0;

}

void Insert(SqStack S,int e)

{

int *p;

int temp;

p=S.base;

if(S.top-S.base=S.stacksize)//z棧滿,追加存儲空間

{

S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREASE)*sizeof(int));

if(!S.base)exit(OVERFLOW);//存儲失敗

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREASE;

}

while(*p=e)

p++;

while(pS.top)

{

temp=*p;

*p=e;

e=temp;

p++;

}

}0

void Pop(SqStack S)

{

if(S.base==S.top)

cout”該棧是空棧”endl;

while(S.baseS.top)

{

cout*++S.base” “;

}

}

void main()

{

SqStack S;

int j,i;

InitStack(S);

for(i=1;i=5;i++)

{

cout”請輸入”i”個棧內元素”endl;

cinj;

Push(S,j);

}

Pop(S);

cout”請輸入你要插入的元素”endl;

cinj;

Insert(S,j);

cout”輸出棧內元素”endl;

Pop(S);

}

c語言 C語言 雙向棧 演算法

#include stdio.h

#include stdlib.h

#include conio.h

#define MaxSize 1024

typedef struct stack {

int data[MaxSize];

int lp; // 左指針

int rp; // 右指針

}*STACK;

/*

棧指針總是指向待壓入位置。初始時,(0#棧)左指針lp指向data[0],即lp == 0;

(1#棧)右指針rp指向data[MaxSize – 1],即rp == MaxSize – 1。當lp == rp時,

還有一個存儲單元可用,所以棧滿的條件是lp  rp。

*/

STACK InitStack() { // 置空雙向棧

STACK S = (STACK)malloc(sizeof(struct stack));

S-lp = 0;

S-rp = MaxSize – 1;

return S;

}

int Full(STACK S) { // 判斷是否滿了

return S-lp  S-rp;

}

int Empty(STACK S, int number) { // 判斷number棧是否為空

if(number  0 || number  1) {

printf(“不存在 #%d 棧。\n”,number);

return 1;

}

if(number) return (S-rp  MaxSize – 1); // 右棧

return S-lp  1; // 左棧

}

int Push(STACK S,int number,int e) { // 入棧

if(number  0 || number  1) {

printf(“不存在 #%d 棧。\n”,number);

return 0;

}

if(Full(S)) {

printf(“棧已滿。\n”);

return 0;

}

if(number) S-data[S-rp–] = e;

else S-data[S-lp++] = e;

return 1;

}

 

int Pop(STACK S,int number,int *e) { // 出棧

if(number  0 || number  1) {

printf(“不存在 #%d 棧。\n”,number);

return 0;

}

if(Empty(S,number)) {

printf(“#%d 空棧已空。\n”,number);

return 0;

}

if(number == 0) *e = S-data[–S-lp];

else *e = S-data[++S-rp];

return 1;

}

原創文章,作者:ZUEP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147419.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZUEP的頭像ZUEP
上一篇 2024-11-01 14:09
下一篇 2024-11-01 14:09

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29

發表回復

登錄後才能評論