建立鏈棧
「linkstack.h」
#pragma once
typedef int elemtype;
typedef struct _node
node;
typedef struct _linkstack
linkstack,*ptrstack;
//初始化
void init(ptrstack stack);
//入棧1
void push(ptrstack stack,int val);
//出棧1
void pop(ptrstack stack,int *val);
//入棧2
void push1(ptrstack stack,char ptr);
//出棧2
void pop1(ptrstack stack,char *ptr);
//清空
void clear(ptrstack stack);
//銷毀
void destroy(ptrstack stack);
//字尾表示式求值
int rpn_num(ptrstack stack,char *str);
//中綴轉字尾
void rpn_change(ptrstack stack,char *str,char *brr);
.cpp
#include"linkstack.h"
#include#include#include#include#include#includevoid init(ptrstack stack)
stack->head.next=null;
}void push(ptrstack stack,int val)
node* newnode=(node*)malloc(sizeof(node));
newnode->data=val;
newnode->next=stack->head.next;
stack->head.next=newnode;
}void pop(ptrstack stack,int *val)
if(stack->head.next==null)
node* q=stack->head.next;
*val=q->data;
stack->head.next=q->next;
free(q);
q=null;
}void push1(ptrstack stack,char ptr)
node* newnode=(node*)malloc(sizeof(node));
newnode->ptr=ptr;
newnode->next=stack->head.next;
stack->head.next=newnode;
}void pop1(ptrstack stack,char *ptr)
if(stack->head.next==null)
node* q=stack->head.next;
*ptr=q->ptr;
stack->head.next=q->next;
free(q);
q=null;
}
中綴轉字尾:
例如:9 + ( 3 - 1 )* 10+ 10 / 2 —> 9 3 1 - 10 * + 10 2 / +
思想:1.迴圈遍歷字串:
(1)遇到數字或者空格就直接輸出(這裡輸出是指將其儲存在額外給的陣列裡)
(2)否則:
遇到加減:如果棧為空就壓棧,不為空則判斷與棧頂元素的優先順序,因為加減小於乘除,而且同級別也需要輸出的關係,即只要棧頂元素為加減乘除的任意乙個,就迴圈出棧並輸出,直到棧為空。
遇到乘除或者左括號,就直接壓棧。
遇到右括號,就將棧中元素依次出棧並輸出,直到遇到左括號。同時再將左括號出棧。
2.遍歷結束之後,因為棧中可能依然有元素的關係,我們需要依次出棧並輸出。
void rpn_change(ptrstack stack,char *str,char *brr)
int i=0,j=0;
char p;
while(str[i]!='\0')
else if(str[i]==' ')
else
else
}push1(stack,str[i]); }}
else if(str[i]==')')
pop1(stack,&p);
}else if(str[i]=='*'||str[i]=='/'||str[i]=='(')
i++;
} }while(stack->head.next!=null)
brr[j]='\0';
}
字尾表示式求值:
思想:1.迴圈遍歷字串:
(1)遇到數字就直接壓棧;因為是字元的關係,為了以免而會將原先乙個數字字元分成兩個字元,需要用乙個標記記錄當前這個是數字並儲存值,下一次迴圈再次遇到數字時,就用儲存的值*10+當前的數字。
(2)遇到空格就直接輸出。
(3)遇到符號就將棧頂的兩個元素出棧,第乙個作為right,第二個作為left,然後將他們計算得出的值壓棧。
int rpn_num(ptrstack stack,char *str)
int num=0;
int i=0;
int left,right;
int ***=-1,count=0;
while(str[i]!='\0')
else if(***==1)
}else if(str[i]=='+')
else if(str[i]=='-')
else if(str[i]=='*')
else if(str[i]=='/')
else if(str[i]==' ')
}pop(stack,&num);
return num;
}
測試
linkstack p;
init(&p);
char str="9 + ( 3 - 1 ) * 10 + 10 / 2";
char *brr=new char[strlen(str)+1]();
rpn_change(&p,str,brr);
printf("%s\n",brr);
//char str="9 3 1- 3 * + 10 2 / +";
int num=rpn_num(&p,brr);
printf("%d\n",num);
中綴表示式轉字尾(逆波蘭)表示式
原則 從左到右遍歷中綴表示式 1 如果是數字則直接輸出 2 如果是左括號,直接入棧 3 如果是右括號,直接棧頂元素出棧並輸出,直到遇到左括號,左括號只出棧,不輸出 4 如果是符號,如果優先順序不高於棧頂符號則棧頂元素依次出棧並輸出 如果遇到 符號,如果棧非空並且棧頂元素不是左括號,則出棧並且輸出,否...
中綴表示式轉字尾表示式,並求值
資料結構之棧的應用 先實現求值這一步吧,已知字尾表示式 轉換這一環節待更新 上 中綴表示式轉字尾表示式 seqstack 以及求值 version 1.0 求值,需要自己輸入字尾表示式 2.0 加上轉化功能 演算法 建立乙個運算元棧,自左向右遍歷字尾表示式,遇到乙個運算元就入棧,遇到乙個操作符就從棧...
逆波蘭計算 中綴轉字尾 字尾表示式計算
我們利用棧將中綴表示式轉換為字尾表示式 逆波蘭表示式 來計算表示式 此程式支援整數運算 遍歷中綴表示式,遇到運算元就輸出,遇到符號就壓入棧中 棧中的運算子為掛起狀態 但是操作符的壓棧出棧有如下規則 碰到運算元壓入棧中,碰到運算子提取棧頂兩個元素進行相應的操作,將運算元壓入棧中,直到整個表示式遍歷完成...